2011-08-23 9 views
10

Bu kodu göz önünde bulundurun:Arabirimler, açıklama notu olarak neden izinli değil?

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

Derleyici hatası:

annotation value not of an allowable type

Foo yerine FooImpl yazarsanız bu kod kabul edilir.

Bu davranışın sebebi nedir?

cevap

7

If I replace Foo with FooImpl the code is accepted.

Eğer FooImpl bir enum olmadıkça, derlenmişse çok şaşırırım.

ek açıklama üyeleri yalnızca aşağıdaki içerebilir:

  • ilkel tür herhangi birine göre
  • Yaylı
  • Sınıf hazır
  • açıklama
  • numaralandırma maddesi
  • ya da 1-boyutlu diziler üstünde,

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.

Kaynak:

3

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

açıklama elemanı tipleri biri olmalıdır: eleman türü ise ilkel, String sınıfı, bir numaralandırma yukarıda

herhangi birinin bir dizi bir derleme hata ElementValue ile orantılı değil.

Bu yardımcı olur umarız!

de bu belgelerde aynı Bulunan:

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

"tipi önceki türleri ilkelleri String sınıfı, enums, ek açıklamalar ve diziler kısıtlanır dönün." Belirtildiği gibi "arayüz" izin verilmiyor.

+0

JLS Ben ilk cümle yerine, ikinci bir problem olarak görünüyor. Açıklamalara neden eklenmesine izin verilmediğini merak ediyorum ... – soc

+3

@soc * İlk cümleyi yerine getiriyorum * Hayır sen yapmazsın. 'Sınıf fooType() 'ın geçerli olduğu anlamına gelir, Foo foo()' değil. –

+0

, Foo Foo() yöntemini bir yöntem olarak düşünür (sadece basitlik uğruna) ... bir yöntem için dönüş türü olarak arayüzden bahsedebilir miyiz? :) – Nik