Tôi đang tìm cách tổng quát để chuyển đổi cá thể org.eclipse.jdt.core.dom.ITypeBinding
thành một phiên bản org.eclipse.jdt.core.dom.Type
. Mặc dù tôi cảm thấy có một số cuộc gọi API để thực hiện việc này, tôi không thể định vị được một cuộc gọi.Chuyển đổi Eclipse JDT ITypeBinding thành Loại
Dường như có nhiều cách khác nhau để thực hiện việc này theo cách thủ công tùy thuộc vào loại cụ thể.
Có cách nào chung để chụp ITypeBinding
và nhận được Type
mà không có tất cả các trường hợp đặc biệt này không? Lấy một số String
và trả về số Type
cũng sẽ được chấp nhận.
Cập nhật
Từ phản ứng cho đến nay, dường như tôi phải xử lý tất cả những trường hợp đặc biệt. Đây là một nỗ lực đầu tiên làm như vậy. Tôi chắc chắn điều này không hoàn toàn chính xác, do đó, giám sát được đánh giá cao:
public static Type typeFromBinding(AST ast, ITypeBinding typeBinding) {
if(ast == null)
throw new NullPointerException("ast is null");
if(typeBinding == null)
throw new NullPointerException("typeBinding is null");
if(typeBinding.isPrimitive()) {
return ast.newPrimitiveType(
PrimitiveType.toCode(typeBinding.getName()));
}
if(typeBinding.isCapture()) {
ITypeBinding wildCard = typeBinding.getWildcard();
WildcardType capType = ast.newWildcardType();
ITypeBinding bound = wildCard.getBound();
if(bound != null) {
capType.setBound(typeFromBinding(ast, bound)),
wildCard.isUpperbound());
}
return capType;
}
if(typeBinding.isArray()) {
Type elType = typeFromBinding(ast, typeBinding.getElementType());
return ast.newArrayType(elType, typeBinding.getDimensions());
}
if(typeBinding.isParameterizedType()) {
ParameterizedType type = ast.newParameterizedType(
typeFromBinding(ast, typeBinding.getErasure()));
@SuppressWarnings("unchecked")
List<Type> newTypeArgs = type.typeArguments();
for(ITypeBinding typeArg : typeBinding.getTypeArguments()) {
newTypeArgs.add(typeFromBinding(ast, typeArg));
}
return type;
}
// simple or raw type
String qualName = typeBinding.getQualifiedName();
if("".equals(qualName)) {
throw new IllegalArgumentException("No name for type binding.");
}
return ast.newSimpleType(ast.newName(qualName));
}
Có một lỗi nhỏ: _capType.setBound (typeFromBinding (ast, ** wildCard.getBound() **), wildCard.isUpperbound()); _ Nếu typeBinding là một bộ sưu tập thô, wildCard.getBound() sẽ trả về null và phương thức sẽ thất bại trong việc tạo ra một kiểu cho một tình huống hợp lệ. Bạn chỉ cần kiểm tra các ràng buộc và không đặt nó để sửa mã. – taksan