Java Generics
Schlüsselwortbeschreibung
? Oder eine Unterklasse von T
Objekt
extends Beispiel
statische Klasse Food{}
statische Klasse Fruit erweitert Food{}statische Klasse Apple erweitert Fruit{}
statische Klasse RedApple erweitert Apple{}
List erweitert Fruit> flist = new ArrayList
// complie error:
// flist.add(new Apple());
// flist.add (new Fruit());
// flist.add(new Object());
flist.add(null); // funktioniert nur für null
List erweitert Frut> bedeutet „eine Liste mit einem beliebigen von Fruit geerbten Typ“. Sie können null hinzufügen, da null jeden Typ darstellen kann. Die Add-Methode von List kann also keine sinnvollen Elemente hinzufügen, kann aber Zuweisungen von vorhandenen Subtypen List
Fruit Fruit = flist.get(0);
Apple apple = (Apple)flist.get(0);
Aufgrund dessen, wo die Platzierung von Fruit geerbt wird Typ, sodass der Fruchttyp sicher entfernt werden kann.
flist.contains(new Fruit());
flist.contains(new Apple());
Wenn Sie die Methode „contains“ in der Sammlung verwenden, akzeptieren Sie den Parameter „Object“. Der Typ muss keine Platzhalter enthalten und der Compiler lässt solche Aufrufe zu.
super example
List super Fruit> flist = new ArrayList
flist.add( new Apple());
flist.add(new RedApple());
// Kompilierungsfehler:
List super Fruit> flist = new ArrayList
Liste super Fruit> bedeutet „eine Liste mit einem beliebigen Obst-Supertyp“, daher ist es sicher, Obst und seine Untertypen hinzuzufügen. Da der Typ in List super Fruit> der Supertyp einer beliebigen Frucht sein kann, kann er nicht dem Untertyp Fruit Apple's List
// Kompilierungsfehler:
Fruchtelement = flist .get(0);
Da der Typ in List super Fruit> ein beliebiger Supertyp von Fruit sein kann, kann der Compiler nicht bestimmen, ob der von get zurückgegebene Objekttyp Fruit oder Fruit ist . Übergeordnete Klasse Food oder Object.
Zusammenfassung
Extends können für die Rückgabetypqualifizierung verwendet werden, können jedoch nicht für die Parametertypqualifizierung verwendet werden.
super kann zur Parametertypqualifizierung verwendet werden, kann jedoch nicht zur Rückgabetypqualifizierung verwendet werden.> Platzhalter mit Super-Supertyp-Qualifikation können in generische Objekte geschrieben werden, und Platzhalter mit erweiterter Subtyp-Qualifikation können aus generischen Objekten gelesen werden.
Weitere Artikel zu generischen Java-Wildcard-Erweiterungen und Super finden Sie auf der chinesischen PHP-Website!