des Typs (Java wird in Core als Supertypqualifizierung bezeichnet), was bedeutet, dass der parametrisierte Typ der Supertyp (übergeordneter Typ) dieses Typs ist, bis Object;
Obergrenze71b63f436d94a50f17c5ed897161f1dd rein, kann aber nur herausgenommen werden
Sie können Folgendes versuchen:
List<? extends Father> list = new LinkedList<Son>(); list.add(new Son());
Auch wenn Sie den Son-Typ angeben, können Sie mit der Add-Methode kein Son-Objekt hinzufügen.
Warum können die Vaterklasse und die Unterklassen der Vaterklasse nicht zur Liste hinzugefügt werden?
List4c15427ba62fe6be91bafa3682773376 bedeutet, dass die Obergrenze Vater ist. Die folgenden Zuweisungen sind zulässig:
list1 kann Vater und alle Unterklassen hinzufügen.
list2 kann Son und alle Unterklassen von Son hinzufügen.
list3 kann LeiFeng und alle Unterklassen von LeiFeng hinzufügen.
Der folgende Code kann nicht kompiliert werden:
List<? extends Father> list1 = new ArrayList<Father>(); List<? extends Father> list2 = new ArrayList<Son>(); List<? extends Father> list3 = new ArrayList<LeiFeng>();
Der Unterschied zwischen dem Platzhalterzeichen 6b3d0130bba23ae47fe2b8e8cddf0195 und Typparametern besteht also darin, dass für den Compiler alle T denselben Typ darstellen. In der folgenden generischen Methode beziehen sich beispielsweise die drei Ts alle auf denselben Typ, entweder String oder Integer.
list1.add(new Father());//error list1.add(new Son());//error
Der Fehler hier ist also, dass nichts in die Liste eingefügt werden kann4c15427ba62fe6be91bafa3682773376.
List erweitert Vaterliste kann nicht hinzugefügt werden, aber dieses Formular ist immer noch sehr nützlich. Obwohl die Add-Methode nicht verwendet werden kann, kann eine Saison während der Initialisierung verschiedene Typen angeben. Zum Beispiel:
public <T> List<T> fill(T... t);
Da wir außerdem sichergestellt haben, dass die Vaterklasse oder eine ihrer Unterklassen in der Liste gespeichert wird, können Sie die get-Methode verwenden, um den Wert direkt zu erhalten:
List<? extends Father> list1 = getFatherList();//getFatherList方法会返回一个Father的子类的list
Untergrenze ; hat keinen Einfluss auf die Vergangenheit. Es wird im Inneren gespeichert, kann jedoch nur beim Herausnehmen in das Objektobjekt eingefügt werden. Die untere Grenze wird mit super deklariert, was bedeutet, dass der parametrisierte Typ der angegebene Typ oder der übergeordnete Typ von sein kann dieser Art, bis hin zu Object.
List<? extends Father> list1 = new ArrayList<>(); Father father = list1.get(0);//读取出来的东西只能存放在Father或它的基类里。 Object object = list1.get(0);//读取出来的东西只能存放在Father或它的基类里。 Human human = list1.get(0);//读取出来的东西只能存放在Father或它的基类里。 Son son = (Son)list1.get(0);
Da die Untergrenze die Untergrenze der minimalen Granularität des Elements angibt, lockert sie tatsächlich die Typkontrolle des Containerelements. Da das Element die Basisklasse von Father ist, kann es in einer kleineren Granularität als die von Father gespeichert werden. Aus Gründen der Typsicherheit können wir Vaterobjekte oder beliebige ihrer Unterklassen (z. B. Sohn) hinzufügen. Da der Compiler jedoch nicht weiß, welche Oberklasse von Vater der Inhalt der Liste ist, ist es nicht zulässig, eine bestimmte Oberklasse hinzuzufügen. Klasse (z. B. Mensch). Und wenn wir es lesen, kann der Compiler nur das Object-Objekt zurückgeben, ohne zu wissen, um welchen Typ es sich handelt, da Object die ultimative Vorgängerklasse jeder Java-Klasse ist. In diesem Fall gehen jedoch alle Typinformationen des Elements verloren.
PECS-Prinzip
Schauen wir uns abschließend an, was das PECS-Prinzip (Producer Extends Consumer Super) ist. Es ist bereits gut verstanden:
Wenn Sie häufig Inhalte von außen lesen, ist es geeignet, das zu verwenden obere Grenze Erstreckt sich.
Das obige ist der detaillierte Inhalt vonWas sind Extends T und Super T in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!