2016-08-15 4 views
0
public class Array<T> { 
    private Object[] array; 
    public Array(int sz) { 
     array = new Object[sz]; 
    } 
    // .... 
    public T get(int index) { return (T)array[index]; } 
    public T[] rep() { return (T[])array; } 
} 

Warum die Compiler sagen, dass (T[])array unkontrolliert gegossen wird, und dann ClassCastException ausgelöst wird, wenn ich die rep() Methode verwenden? Und warum wird diese Ausnahme nicht ausgelöst, wenn ich die Methode get()() verwende?Was ist der Unterschied zwischen dem generischen Array und dem generischen Wert?

+1

Ihr Problem hat nichts mit den Generika zu tun. Das kann für Sie interessant sein: [hier] (http://stackoverflow.com/a/13647072/5333936) – Blobonat

+0

Kurze Antwort: Sie können aufgrund eines Löschvorgangs nicht auf einen generischen Typ umwandeln. Verwenden Sie 'List ' anstelle von 'Object []'. – VGR

Antwort

1

Warum wird diese Ausnahme nicht ausgelöst, wenn ich die get() Methode() verwende?

Es gibt zwei Gründe dafür:

  1. Unter der Annahme, dass keine Elemente zu array in Ihrem Programm hinzugefügt wurden, die array wird mit sz Anzahl der null Werte initialisiert werden .. Die Aussage (T)array[index] ist versuchen, eine null in eine T zu werfen (wobei T im Wesentlichen durch Object durch Typ löschen ersetzt wird). Ein null kann in einen beliebigen Typ umgewandelt werden, daher ist dies kein Problem.
  2. Unter der Annahme, dass einige Elemente zu array in Ihrem Programm hinzugefügt werden, ist die einzige Art und Weise, dass die Aussage (T)array[index] ohne Probleme funktionieren wird, wenn das Element an Position index ist vom gleichen Typ oder einem gebrauchten Subtyp Array (zB Array<Number> arr = new Array<Number> zum Instanziieren und arr[index] ist 1. Dies wird kein Problem sein, aber versuchen, ein String bei arr[index] Einfügen, und Sie sind auch)

Warum die Compiler sagen, dass (ein ClassCastException aus dem get Methode erhalten gebunden T []) Array ist deaktiviert, und dann Klasse CastException wird ausgelöst, wenn ich die rep verwenden()

Der einzige Weg für Sie eine ClassCastException zu bekommen, ist, dass die von T vertreten Typ ist nicht das gleiche wie die Art der Elemente, die array halten kann. Zum Beispiel, etwas zu tun, wie folgt in einem ClassCastException führen:

Array<Integer> a = new Array<Integer>(); 
Integer[] intArray = a.rep();//ClassCastException 

Hier T[] stellt ein Integer[] so gibt es keine Probleme in den Code kompilieren; Zur Laufzeit ist array jedoch vom Typ Object[]. Ein Array von Object kann nicht auf ein Array von Integer reduziert werden. Es wäre auch hilfreich zu wissen, dass Arrays im Gegensatz zu anderen Klassen von der JVM dynamisch erstellt werden.

Eine Möglichkeit, dies zu beheben, wäre die Instanziierung Array als Array<Object> arr = new Array<Object>.

1

In get(), kümmern Sie sich nur um den tatsächlichen Laufzeittyp der Elemente innerhalb des Arrays, die ich richtig annehmen, weil Sie eine Methode haben, die nur T s in das Array setzt. Der tatsächliche Laufzeittyp des Arrays spielt keine Rolle.

In rep() kümmern Sie sich um den tatsächlichen Laufzeittyp des Array-Objekts, da Sie es auf T[] umwandeln.Sie haben das Array mit dem tatsächlichen Laufzeittyp Object[] erstellt, sodass die Umwandlung in T[] immer falsch ist, es sei denn, T ist zufällig Object.

Verwandte Themen