2011-08-23 33 views
10

xem xét mã này:Tại sao giao diện không được phép làm thành viên chú thích?

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface Bar { 
    Foo foo() default FooImpl.FooConstant; 
} 

biên dịch báo lỗi:

annotation value not of an allowable type

Nếu tôi thay Foo với FooImpl mã được chấp nhận.

Lý do của hành vi này là gì?

loại thành viên

Trả lời

7

If I replace Foo with FooImpl the code is accepted.

Tôi sẽ rất ngạc nhiên nếu điều này được biên soạn, trừ khi FooImpl là một enum.

thành viên Chú chỉ có thể chứa những điều sau đây:

  • kiểu nguyên thủy
  • Chuỗi
  • Lớp đen
  • chú thích
  • enum mục
  • hoặc 1 chiều mảng của bất kỳ của trên

It is a compile-time error if the return type of a method declared in an annotation type is any type other than one of the following: one of the primitive types, String, Class and any invocation of Class, an enum type (§8.9), an annotation type, or an array (§10) of one of the preceding types. It is also a compile-time error if any method declared in an annotation type has a signature that is override-equivalent to that of any public or protected method declared in class Object or in the interface annotation.Annotation.

Nguồn: JLS

3

http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.7

Các chú thích phải là một trong: nguyên thủy, String, Class, một Enum, một mảng của bất kỳ ở trên

Đó là một lỗi thời gian biên dịch nếu các loại nguyên tố là không tương xứng với ElementValue.

Hy vọng điều này sẽ hữu ích!

Tìm thấy cùng trong tài liệu này cũng như:

http://download.oracle.com/javase/1.5.0/docs/guide/language/annotations.html

"Return loại bị hạn chế nguyên thủy, String, Class, enums, chú thích và các mảng của các loại trước đó." Như đã đề cập "giao diện" không được phép.

+0

Tôi thực hiện câu đầu tiên, câu thứ hai có vẻ là vấn đề. Tôi tự hỏi tại sao điều này không được phép trong các chú thích ... – soc

+3

@soc * Tôi thực hiện câu đầu tiên * Không, bạn không. 'Lớp fooType() 'sẽ hợp lệ,' Foo foo() 'thì không. –

+0

xem xét Foo Foo() như là một phương pháp (chỉ vì lợi ích của sự đơn giản) ... chúng ta có thể đề cập đến giao diện như kiểu trả về cho một phương thức? :) – Nik

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