Bedenken Sie den folgenden Codeausschnitt:
ArrayList<String> a = new ArrayList<String>(); String[] s = a.toArray(new String[0]);
Dieser Code wird sowohl in Java 6 als auch in 7 erfolgreich kompiliert. Wenn die Listenreferenz jedoch als Rohtyp deklariert ist:
ArrayList a = new ArrayList(); String[] s = a.toArray(new String[0]);
Es führt zu a Compilerfehler, der besagt, dass String[] erforderlich ist, Object[] jedoch gefunden wurde. Dieses Verhalten ist unerwartet, da die Signatur der toArray-Methode wie folgt lautet:
<T> T[] toArray(T[] a);
was anzeigt, dass die Methode parametrisiert ist und ihr Typparameter keine Beziehung zu dem der Liste hat.
Zum Verständnis Warum dieser Code nicht kompiliert werden kann, ist es wichtig zu beachten, dass die Verwendung eines Rohtyps für eine Instanzreferenz die Möglichkeit zur Verwendung von Generika für eines seiner Instanzmitglieder ungültig macht. Dieses Verhalten ist nicht auf generische Methoden beschränkt, wie das folgende Snippet zeigt:
public class MyContainer<T> { public List<String> strings() { return Arrays.asList("a", "b"); } } MyContainer container = new MyContainer<Integer>(); List<String> strings = container.strings(); // This line will produce an unchecked warning!
Diese Einschränkung ist in der Java Language Specification (4.8) angegeben:
"Der Typ eines Konstruktors , Instanzmethode oder nicht statisches Feld M eines Rohtyps C, der nicht von seinen Superklassen oder Superschnittstellen geerbt wird, ist der Rohtyp, der der Löschung seines Typs in der entsprechenden generischen Deklaration entspricht bis C.“
Das obige ist der detaillierte Inhalt vonWarum verhindert die Verwendung eines Rohtyps für eine Listenreferenz die Verwendung einer generischen Methode?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!