Heim > Java > javaLernprogramm > Warum verhindert die Verwendung eines Rohtyps für eine Listenreferenz die Verwendung einer generischen Methode?

Warum verhindert die Verwendung eines Rohtyps für eine Listenreferenz die Verwendung einer generischen Methode?

Patricia Arquette
Freigeben: 2024-11-11 22:38:02
Original
580 Leute haben es durchsucht

Why Does Using a Raw Type for a List Reference Prevent Generic Method Usage?

Rohtypen und generische Methoden kombinieren

Bedenken Sie den folgenden Codeausschnitt:

ArrayList<String> a = new ArrayList<String>();
String[] s = a.toArray(new String[0]);
Nach dem Login kopieren

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]);
Nach dem Login kopieren

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);
Nach dem Login kopieren

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!
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage