Das Annotationsattribut muss ein Klassenliteral sein? Warum? Konstanten sollten auch in Ordnung sein

8

Kann jemand erklären, warum String- und Class-Annotation-Parameter unterschiedlich erwartet werden? Warum benötigt der Compiler Literale für Klassen und akzeptiert auch Konstanten für Strings?

Arbeitsbeispiel mit Spring @RequestMapping:

%Vor%

WTF Beispiel mit TestNG's @Test:

%Vor%

Was natürlich funktioniert, ist @Test (expectedExceptions = RuntimeException.class). Aber warum? Der einzige Unterschied im Annotationsparameter, den ich sehe, ist der Typ: String vs Class. Warum in aller Welt würde der Java-Compiler auch die String-Konstante akzeptieren, aber nur Klassenliterale akzeptieren?

    
sibidiba 22.12.2011, 13:09
quelle

3 Antworten

5

Die Java-Sprachspezifikation erlaubt keine Verwendung von Kompilierzeitkonstanten mit Parametern vom Typ Class . Sie können nur Klassenliterale verwenden.

Die JLS enthält die folgenden Informationen zu geeigneten Parameterwerten für Anmerkungen:

  

Ein Elementtyp T entspricht genau dann einem Elementwert V , wenn eine der folgenden Bedingungen zutrifft:

     
  • T ist ein Array-Typ E [] und entweder:   
    • V ist ein ElementValueArrayInitializer und jeder ElementValueInitializer (analog zu einem Variableninitialisierer in einem Arrayinitialisierer) in V ist angemessen mit E . Oder
    •   
    • V ist ein ElementValue , der T entspricht.
    •   
  •   
  • Der Typ von V ist zuweisungskompatibel ( §5.2 ) mit T und außerdem:   
    • Wenn T ein primitiver Typ oder String ist, ist V ein konstanter Ausdruck (§15.28) .
    •   
    • V ist nicht null.
    •   
    • Wenn T eine Klasse oder ein Aufruf der Klasse ist und V ein Klassenliteral ist (§15.8.2) .
    •   
    • Wenn T ein Aufzählungstyp ist und V eine Aufzählungskonstante ist.
    •   
  •   

Es ist ein Fehler bei der Kompilierung, wenn der Elementtyp nicht dem ElementValue entspricht.

Ich kann jedoch nicht sagen, warum diese Einschränkung in der JLS ist.

    
Luke Woodward 22.12.2011, 15:58
quelle
1

Ich habe den "Annotation-Wert muss ein Klassenliteral sein" auf dem folgenden:

%Vor%

Dies geschieht, während Sie einer von Oracles Tutorials auf Websockets folgen. Es stellt sich heraus, dass das Video nicht die 720p-Qualität hat und die Unschärfe die Klammern, die wie geschweifte Klammern aussehen, verbirgt. Der Fehler verschwindet also, wenn Klammern (Klammern) für geschweifte Klammern geändert werden.

%Vor%

hth jeder, der in Zukunft über dasselbe stolpern kann.

    
buzzzz717 21.02.2014 21:48
quelle
0

Sieh dir das an:

%Vor%

Die Klasse sollte eine Throwable sein, die der Compiler überprüfen kann. Also, versuche das:

%Vor%     
Victor Stafusa 22.12.2011 13:27
quelle

Tags und Links