2012-02-24 24 views
20

Tôi đang sử dụng Java 1.6.0_25.Tại sao Class.getAnnotation() yêu cầu tôi thực hiện một dàn diễn viên?

Tôi có một chú thích định nghĩa:

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Resource { 
    String value(); 
} 

Và sau khi tôi sử dụng getAnnotation:

Resource resource = (Resource)cls.getAnnotation(Resource.class); 

trình biên dịch và IDE đồng ý rằng tôi phải đúc kết quả, nhưng getAnnotation được khai báo trong Java 1.5 tài liệu dưới dạng:

public <A extends Annotation> A getAnnotation(Class<A> annotationClass); 

Vì Resource.class thuộc loại Class, có vẻ như tôi rằng điều này có nghĩa là cls.getAnnotation (Resource.class) phải trả về kiểu Resource, và tôi cần phải cast.

Tất cả các ví dụ tôi đã tìm thấy bằng cách sử dụng getAnnotation không có dàn diễn viên, vì vậy tôi phải làm điều gì đó sai.

Trả lời

24

Loại cls là gì? Có phải dữ liệu là Class hoặc là Class<Something>?

Nếu đó là kiểu thô Class thì bạn cần phải truyền. Nếu bạn tạo ít nhất Class<?> thay vì Class, bạn sẽ không cần sử dụng diễn viên nữa.

Class cls = Example.class; 

// Error: Type mismatch, cannot convert from Annotation to Resource 
Resource anno = cls.getAnnotation(Resource.class); 

Class<?> cls2 = Example.class; 
Resource anno = cls2.getAnnotation(Resource.class); // OK 

Class<Example> cls3 = Example.class; 
Resource anno = cls3.getAnnotation(Resource.class); // OK 
+1

này làm việc nhưng vì tò mò: tại sao không phải là dòng đầu tiên biên dịch? Phương thức getAnnotation không sử dụng T của Class vì thế nó không tạo nên sự khác biệt nào? (nó rõ ràng không !!) – assylias

+1

Tôi nghĩ rằng khi bạn sử dụng lớp nguyên 'Lớp', trình biên dịch sẽ quên tất cả các generics trong lớp để tương thích ngược với Java trước khi Generics. – Jesper

+1

Chắc chắn đã hoạt động. Có vẻ kỳ quặc, nhưng tôi đoán @Jesper đúng là nó tương thích ngược. –

Các vấn đề liên quan