1. Definition
Generisch bezieht sich auf die Fähigkeit, Typen zu parametrisieren. Sie können eine Klasse oder Methode mit einem generischen Typ definieren und der Compiler sie dann durch einen konkreten Typ ersetzt (generische Instanziierung). Der Hauptvorteil der Verwendung von Generika ist die Möglichkeit, Fehler zur Kompilierungszeit und nicht zur Laufzeit zu erkennen. Es handelt sich um eine Funktion, die nach jdk1.5 eingeführt wurde, um die Sicherheit zu erhöhen. Mein Verständnis ist, dass es sich eher um eine spezielle Spezifikation handelt. Wenn der Programmierer es beispielsweise aufruft oder wenn der Kunde es einführt, kann er das Gute nicht mit dem Guten vermischen. ! In der vorherigen Definition hieß es, wenn Sie einen String-Typ eingeben und hier ungehorsam sind, besteht keine Notwendigkeit, die Ausführung fortzusetzen, und Sie werden direkt getötet.
2. Nachteile undefinierter Generika
1. Achtung, keine generische Parametrisierung
2. Es können alle Arten von Objekten geladen werden hinein, was unsicher ist
3. Beim Abrufen der Daten in der Sammlung muss die Kompilierung erzwungen werden
import java.util.Iterator;import java.util.Set;import java.util.TreeSet;public class Test {public static void main(String[] args) { Set treeSet = new TreeSet();//没有使用泛型,应该这样:Set<Student> treeSet = new TreeSet<Student>();treeSet.add(new Student(11, 80, "李平")); treeSet.add(new Student(23, 40, "王芳")); treeSet.add(new Student(10, 60, "赵磊")); treeSet.add(new Student(12, 40, "王小二")); treeSet.add(new Student(10, 60, "马苗")); treeSet.add(new Student(18, 60, "马苗")); treeSet.add(new Student(25, 70, "姜浩")); Iterator it = treeSet.iterator();while (it.hasNext()) { Student stu = (Student) it.next();//没有使用泛型:需要强转 System.out.println(stu); } } }
Fehler melden (gelb):
Nach der Änderung:
Hinweis: Generische Typen müssen Referenztypen sein! ! !
Hinweis: Generische Typen müssen Referenztypen sein! ! !
Hinweis: Generische Typen müssen Referenztypen sein! ! !
3. Formulierung von Generika
In JDK sehen wir oft die folgenden drei Situationen:
1.TreeSet(Collection erweitert E> c)
2.TreeSet(Comparator super E> comparator)
3.TreeSet( SortedSet wobei sich auf einen beliebigen Datentyp bezieht < (Wie zu sehen ist, ist 3 die normale Definition von Generika) Hinweis unten: Die Obergrenze von Generika: erweitert E > Typ oder Untertyp von E Codebeispiel: (Bilder aus dem Internet) 4. Verstehen Sie die Anwendung von Generika Wir können generische Klassen, generische Methoden und generische Schnittstellen anpassen. Beim Lernen müssen Sie das Prinzip kennen und können es in Zukunft problemlos im JDK aufrufen 2. Generische Methoden 3. Generische Schnittstellen 5. Allgemeine Einschränkungen 1. Sie können keine generischen Parameter zum Erstellen von Instanzen verwenden, d. h. Sie können kein neues E() verwenden 🎜> 2. Ausnahmeklassen können nicht generisch sein 3. Die Parameter einer Klasse dürfen in einer statischen Umgebung keine generischen Typen sein (Hinweis) Da alle Instanzen von a Die generische Klasse ist dieselbe Laufzeitklasse, daher werden die statischen Variablen und Methoden der generischen Klasse von allen ihren Instanzen gemeinsam genutzt. Da es gemeinsam genutzt wird, besteht keine Notwendigkeit, denselben generischen Typ neu zu definieren. Wenn Sie nicht denselben generischen Typ definieren und keine gemeinsame Nutzung (oder Konsistenz) erreichen können, besteht keine Notwendigkeit, diese Situation bestehen zu lassen. Daher ist es illegal, Klassenparameter in einer statischen Umgebung auf Generika zu setzen. Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung von Beispielen für Generika in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Untere Grenze der Generika: super E > // Gibt den Empfang des Typs von E oder des übergeordneten Typs von E an //这时这个函数只能接收 Number及其子类static void show(Point<? extends Number> p){
System.out.println(p.getX());
System.out.println(p.getY());
} public static void main(String[] args) {/* 对于上面的声明,下面的操作是可以的
Point<Integer> p1=new Point<Integer>();
p1.setX(new Integer(90));
p1.setY(new Integer(50));
show(p1); *///下面的操作将出错Point<String> p1=new Point<String>();
p1.setX("90ok");
p1.setY("50ok");
show(p1); //出错
show(Point<? String> <String> p1= Point<String>"90ok""50ok"
class ObjectFactory<T> { // 声明泛型為<T>private T obj;public T getObj() {return this.obj;
}public void setObj(T obj) {this.obj = obj;
}/* * 下面的写法不成立 public T getNewObj(){ T t=new T(); //在编译期,无法确定泛型的参数化的类型 return
* t; } */}class Test4 {public static void main(String[] args) {// List list=new ArrayList();/* * ObjectFactory f=new ObjectFactory(); f.SetObj("ss"); */ObjectFactory<String> f = new ObjectFactory<String>();
f.setObj("这里必须是String");// f.SetObj(89); 不可以String obj = f.getObj();
System.out.println(obj);
ObjectFactory<Student> stuList = new ObjectFactory<Student>();
stuList.setObj(new Student(67, 90, "张三"));
stuList.getObj().speak();
}
}
public class TestFan { // 泛型方法,这里不做限制,传什么都可以public <T> void show(T t) {
System.out.println("这是泛型方法中的" + t);
}
}class Test5 {public static void main(String[] args) {
TestFan tfan = new TestFan();
tfan.show("777");
tfan.show(898);
tfan.show(new Student(30, 20, "猫"));
}
}