2012-03-30 1 views
0

Ich habe eine Annotation, die ich versuche zu definieren, die einen Class-Parameter nimmt. Ich möchte sicherstellen, dass die zur Verfügung gestellte Klasse eine spezifische Schnittstelle erweitert. Also kam ich auf ...Wie stellen Sie sicher, dass ein Klassenanmerkungs-Parameter eine Schnittstelle zur Kompilierungszeit erweitert?

Allerdings bekomme ich einen Kompilierfehler von "inkompatiblen Typen".

Ich nehme an, dies ist, weil NoStyle.classClass anstelle von Class<NoStyle> zurückgibt. In der JLS für Java SE 5 & 7 (konnte 6 nicht finden, verwende ich 6) es sagt ausdrücklich, dass "void.class" "Klasse" zurückgeben würde. SEE JLS Klassenliterale: http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.8.2

Gibt es trotzdem zur Kompilierzeit dies zu tun? Wenn nicht ich den workround bin zu raten ist, den Wert des Stils zur Laufzeit zu überprüfen, um sicherzustellen, dass es ITagStyle erweitert: '(

AUFLöSUNG: JDeveloper einen Fehler in ihrem ‚in process‘ Compiler Überprüfung „außerhalb des Prozesses. "oder JDK7u3 Verwendung korrigiert die Compiler-Fehler

+0

Funktioniert für mich. Was ist die vollständige Fehlermeldung? –

+0

Funktioniert auch für mich :) – adarshr

+0

Fehler: inkompatible Typen. Um genauer zu sein, verwende ich jdk1.6.0_26 ... vielleicht ein Fehler? – xer21

Antwort

0

Dies funktioniert, also entweder Sie etwas offensichtlich oder Ihre Fehler fehlen nicht im Zusammenhang zu dem, was Sie uns zeigen.

public class Test { 

    public interface ITagStyle { 
    } 

    public @interface Tag { 
     Class<? extends ITagStyle> style() default NoStyle.class; 
    } 

    public class NoStyle implements ITagStyle { 
    } 

    public class SomeStyle implements ITagStyle { 

    } 

    @Tag(style = SomeStyle.class) 
    public static void main(String[] args) { 

    } 
} 

Dieses auf JDK getestet wurde 1,6 .0_26