2016-05-22 8 views
0

Das Orakel doc sagt Generics sind in Java mit einer Technik Call-Typ Löschung implementiert und so funktioniert es.Java-Typ löschen und Arrays

  1. Ersetzen Sie alle Typparameter in generischen Typen durch ihre Grenzen oder Object, wenn die Typparameter unbegrenzt sind. Der erzeugte Bytecode enthält daher nur gewöhnliche Klassen, Schnittstellen und Methoden.
  2. Falls erforderlich, Typumformungen einfügen, um die Typensicherheit zu gewährleisten.
  3. Generieren Sie Bridge-Methoden, um Polymorphie in erweiterten generischen Typen zu erhalten.

Also, wenn ich eine generische Klasse Container sagen, wie unten:

class Container<T>{ 
T initialValue; 
List<T> valueList=new ArrayList<T>(); 
public List<T> getValueList(){ 
    return valueList; 
} 

} 

es gleichwertige Klasse ist wie nach Typ Löschung nach der Verarbeitung aussehen:

class Container{ 
    Object initialValue; 
    List valueList=new ArrayList(); 
    public List getValueList(){ 
     return valueList; 
    } 

    } 

mich korrigieren, wenn eine falsche hier

In ähnlicher Weise, wenn eine der oben genannten Klasse wie folgt ändern

class Container<T>{ 
    T initialValue; 
    List<T> valueList=new ArrayList<T>(); 
    T[] arrayValue; 
    public Container(T[] array){ 
     arrayValue=array; 
    } 
    public List<T> getValueList(){ 
     return valueList; 
    } 

    } 

wird nicht das sein ???

class Container{ 
    Object initialValue; 
    List valueList=new ArrayList(); 
    Object[] arrayValue; 
    public Container(Object[] array){ 
     arrayValue=array; 
    } 
    public List getValueList(){ 
     return valueList; 
    } 

    } 

wenn dies wahr ist, dann sollte ich auch wie dieses: T[] arrayValue=new T[10]; // Zeitfehler Kompilieren; wie die obige Aussage würde in

Object[] arrayValue=new Object[10]; 

Klarheit Löschung, wie Art arbeitet für Arrays in Java Brauchen Sie konvertiert ??

+0

Was ist der Fehler Sie sehen, mit Welcher Code speziell? Es ist nicht wirklich klar, was du fragst. – pvg

+0

warum T [] arrayValue = new T [10]; ist nicht erlaubt. Warum können wir kein Array Objekt des parametrisierten Typs erstellen? –

Antwort

1

Sie können keine generischen Arrays erstellen. Der Grund dafür ist, dass Arrays vor den Generika von Java liegen und Arrays kein Typenlöschverfahren verwenden. So haben zum Beispiel ein Integer[] und ein String[] zur Laufzeit wirklich einen anderen Typ. Wenn Sie new T[] schreiben, weiß der Compiler nicht, welche Art von Array er erstellen muss.

T[] array = (T[]) new Object[10]; 

Aber Sie müssen bedenken, dass Sie wirklich eine Object Array erstellt, kein T Array:

Sie können, indem Sie eine gefälschte generische Array erstellen. Zur Laufzeit ist es möglich, nicht-T Instanzen darin zu setzen, also tun Sie dies nur, wenn das Array ein privates Feld Ihrer Klasse ist, das nie an andere Objekte übergeben wird, so dass Sie genau steuern können, welche Objekte in die Array.

Wenn Sie eine Class<T> Instanz (ein so genannten Typ-Token) Sie Array.newInstance verwenden können, ein neues Array mit dem richtigen Laufzeittyp zu erstellen:

T[] array = (T[]) Array.newInstance(typeToken, 10); 
+0

Also funktioniert Typ Löschung nicht mit Arrays? –

+0

Nein, das Löschen des Typs funktioniert nicht mit Arrays.Zur Laufzeit haben eine 'Liste ' und eine 'Liste ' denselben Typ, nämlich 'List', aber ein' Integer [] 'und ein' String [] 'haben * verschiedene * Typen. – Hoopje