des Typs (Java wird in Core als Supertypqualifizierung bezeichnet), was bedeutet, dass der parametrisierte Typ der Supertyp (übergeordneter Typ) dieses Typs ist, bis Object;
Obergrenze erweitert T> rein, kann aber nur herausgenommen werden
import java.util.LinkedList; import java.util.List; public class test { public static void main(String[] args) { List<? extends Father> list = new LinkedList<>(); list.add(new Son()); } } class Human{ } class Father extends Human{ } class Son extends Father{ } class LeiFeng extends Father { }
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?
List erweitert Vater> 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 > 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 kann erweitert Vater>.
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!