2013-06-15 10 views
6

Ich gehe durch die JLS 7, um den Typ Gießen Section 5.5.1 zu verstehen.Java-Sprache Spezifikation: Bedeutung der Notation | S |

Dort heißt es: einen Compiler-Referenztyp S (Quelle) und einen Compiler-Referenztyp T (Ziel), ein Guss Umwandlung besteht aus S gegeben, wenn keine Kompilierung-Fehler auf T aufgrund der auftreten Regeln befolgen. Wenn S ist ein Klasse-Typ:

  • Wenn T ein Klassentyp ist, dann entweder | S | <: | T | oder | T | <: | S |. Andernfalls tritt ein Kompilierungszeit Fehler auf.

Sie machten deutlich, wenn S und T sind zwei Typen in Section 4.10, dann

  • S:> T zeigt S ein Supertyp von T ist
  • S> T zeigt an, dass S ein richtiger Supertyp von T ist, was bedeutet S:> T und S! = T.

Ich bin nicht in der Lage, die Bedeutung | S | zu finden. Bitte helfen Sie mir zu verstehen, was es bedeutet, | S |? Bedeutet es die Anzahl und Arten von Eigenschaften oder etwas anderes? Ich habe versucht, es in JLS selbst zu suchen, konnte aber seine Bedeutung nicht finden. Danke im Voraus.

+4

So fand ich: http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.6 „Wir schreiben | T | zum Löschen von Typ T " – mrak

+0

Vielen Dank. –

Antwort

2

Ich bin nicht in der Lage, bessere und weniger formelle Erklärung, dass das Dokument für Typ löschen. In Ihrem Fall (Class Casting) "Wenn T ein Klassentyp ist, dann entweder | S | <: | T | oder | T | <: | S |. Andernfalls tritt ein Fehler bei der Kompilierung auf." bedeutet, dass nach Klassenlöschung eine Klassenübergabe zulässig ist, wenn die generischen Argumenttypen in "Klassenunterklassenbeziehung" sind. Ein einfaches Beispiel dafür:

 

    static class Bar {} 
    static class FooBar extends Bar {} 

    public static void main(String[] args) { 

     List<FooBar> foobarList = (List<FooBar>) newList(Bar.class); 
     List<Bar> barList = (List<Bar>) newList(FooBar.class); 

     System.out.println("No cast class exception :)"); 
    } 

    private static<T> List<?> newList(Class<T> clazz) { 
     return new ArrayList<T>(); 
    } 
 
+0

Danke für die Antwort. Ich wollte nur die Theorie verstehen, die hinter den Kulissen funktioniert. –