Schauen wir uns zunächst das folgende Beispiel an:
Das Array, das wir zuvor gelernt haben, kann nur Elemente bestimmter Typen speichern. Zum Beispiel:
Die Object-Klasse ist die übergeordnete Klasse aller Klassen. Können wir also ein Obj-Array erstellen?class Myarray{ public Object[] array=new Object[10]; public void setVal(int pos,Object val){ this.array[pos]=val; } public Object getPos(int pos){ return this.array[pos]; } } public class TestDemo{ public static void main(String[] args) { Myarray myarray=new Myarray(); myarray.setVal(1,0); myarray.setVal(2,"shduie");//字符串也可以存放 String ret=(String)myarray.getPos(2);//虽然我们知道它是字符串类型,但是还是要强制类型转换 System.out.println(ret); } }
int[] array=new int[10];String[] array=new String[10];
Nachdem der obige Code implementiert wurde, haben wir Folgendes gefunden:
2. Generische Syntax:
Generischer Klassenname 534555a28557cbf034b2f43ad16c370e Variablenname=neues generisches Klassenargumenteb29d0e90f8eefd99e027aeefc4f2c15 (Konstruktormethodenargument) Platzhalter, der angibt, dass die aktuelle Klasse eine generische Klasse ista8093152e673feb7aba1828c43532094 Nimmt nicht an der teil Typzusammensetzung von GenerikaBeim Instanziieren einer generischen Klasse kann a8093152e673feb7aba1828c43532094 kein einfacher Typ sein, es muss eine Wrapper-Klasse sein
Es können keine neuen Arrays von generischen Typen erstellt werden
Ein einfaches Generikum:Die Verwendung von Generika erfordert keine erzwungene Typkonvertierung
//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型 //在实例化泛型类时,必须指定T的具体类型 public class Test<T>{ //key这个成员变量的类型为T,T的类型由外部指定 private T key; public Test(T key) { //泛型构造方法形参key的类型也为T,T的类型由外部指定 this.key = key; } public T getKey(){ //泛型方法getKey的返回值类型为T,T的类型由外部指定 return key; } }
4, Wildcard
Die folgenden zwei Codeteile:
代码一: public static<T> void printList1(ArrayList<T> list){ for(T x:list){ System.out.println(x); } } 代码二: public static<T> void printList2(ArrayList<?> list){ for(Object x:list){ System.out.println(x); } }
Wildcards werden in Code 2 verwendet. Im Vergleich zu Code 1 kennen wir derzeit nicht den spezifischen Datentyp, der an Code 1 übergeben wird. ?? Tierunterklassen.
AnimalCat erweitert Animal
Dog erweitert Animalpublic static <t extends Animal> void print1(List<T> list>{ for(T animal:list){ System.out.println(animal);//调用了T的toString } }
Zu diesem Zeitpunkt ist der T-Typ eine Unterklasse von Animal oder sich selbst. Code 2: Implementiert durch Platzhalterpublic static void print2(List<? extends Animal> list){ for(Animal animal:list){ Syatem.out.println(animal);//调用了子类的toString方法 } }Der Unterschied zwischen den beiden Codes:
Für die von Generics implementierte Methode schränkt 4625de58097cc69acd0f6713ee5c075b T ein und kann nur eine Unterklasse von Animal sein. Geben Sie Cat ein, es ist Cat.
Für Methoden, die durch Platzhalter implementiert werden, ist dies gleichbedeutend damit, Animal festzulegen und die Übergabe von Unterklassen von Animal zuzulassen. Die konkrete Unterkategorie ist derzeit nicht klar. Beispiel: Wenn Cat übergeben wird, ist der deklarierte Typ Animal. Nur durch Verwendung von Polymorphismus kann die toString-Methode von Cat aufgerufen werden.
Obere Grenze der Wildcards→ um Platzhalter zu verwenden, um den Eltern-Kind-Typ zu bestimmen. MyArrayList5a1312bd1de15616f5bbc24ce87c8691 Was in der Liste gespeichert ist, kann eine Zahl oder eine Unterklasse von Zahl sein, und der Typ kann nicht bestimmt werden.
(2) Untere Grenze des Platzhalters
Syntax:
eec35f240cc465d5ab9eaf067a25c9fe474555482eb79f9e4e676a9012437c1d//Der Parametertyp, der übergeben werden kann, ist Integer oder die übergeordnete Klasse von GanzzahlEltern-Kind-Klassenbeziehung der Wildcard-Untergrenze:MyArrayList474555482eb79f9e4e676a9012437c1d是MyArrayList1c0477c859e3a4cbd4faa63087d62a35的父类类型
MyArrayLista10469e4b40f04339ce5bebfbf5abb4c是MyArrayList474555482eb79f9e4e676a9012437c1d的父类
通配符下界适合写入元素,不适合读取。
5、包装类
在Java中,由于基本类型不是继承自Object,为了在泛型中可以支持基本类型,每个基本类型都对应了一个包装类。除了Integer和Character,其余基本类型的包装类都是首字母大写。
拆箱和装箱:
int i=10; //装箱操作,新建一个Integer类型对象,将i的值放入对象的某个属性中 Integer ii=i; //自动装箱 //Integer ii=Integer.valueOf(i); Integer ij= new Integer(i);//显示装箱 //拆箱操作,将Integer对象中的值取出,放到一个基本数据类型中 int j=ii.intValue();//显示的拆箱 int jj=ii;//隐式的拆箱
Das obige ist der detaillierte Inhalt vonBeispielanalyse von Java-Generika und Wrapper-Klassen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!