1. Définition
Le générique fait référence à la possibilité de paramétrer les types. Vous pouvez définir une classe ou une méthode avec un type générique, puis le compilateur la remplace par un type concret (instanciation générique). Le principal avantage de l’utilisation des génériques est la possibilité de détecter les erreurs au moment de la compilation plutôt qu’au moment de l’exécution. C'est une fonctionnalité apparue après jdk1.5 pour renforcer la sécurité. Je crois comprendre qu'il s'agit plutôt d'une spécification spéciale. Par exemple, lorsque le programmeur l'appelle ou lorsque le client l'introduit, il ne peut pas mélanger le bien et le bien. Il peut faire ce qu'il veut. ! La définition précédente disait que si vous entrez un type String, si vous désobéissez ici, il n'est pas nécessaire de vous laisser continuer l'exécution et vous serez tué directement.
2. Inconvénients des génériques non définis
1 Attention, pas de paramétrage générique
2. dedans, ce qui est dangereux
3. Lors de la récupération des données dans la collection, transfert forcé
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); } } }
compiler Commencer à signaler les erreurs (jaune) :
Après modification :
Remarque : Les types génériques doivent soyez des types de référence! ! !
Remarque : les types génériques doivent être des types de référence ! ! !
Remarque : les types génériques doivent être des types de référence ! ! !
3. Formulation de génériques
Dans JDK on voit souvent les trois situations suivantes :
1.TreeSet(Collection extends E> c)
2.TreeSet(Comparator super E> comparateur)
3.TreeSet( SortedSet où, ? Le caractère générique fait référence à tout type de données auquel < (Comme on peut le voir, 3 est la définition normale des génériques) Remarque ci-dessous : La limite supérieure des génériques : étend E > Type, ou sous-type de E Exemple de code : (photos d'Internet) 4. Comprendre l'application des génériques. Nous pouvons personnaliser les classes génériques, les méthodes génériques et les interfaces génériques. Vous devez connaître son principe lors de l'apprentissage, et vous pourrez volontiers l'appeler dans le JDK à l'avenir ~~ 1 Classe générique personnalisée 2. Méthodes génériques 3. 🎜> 5. Restrictions génériques1 Vous ne pouvez pas utiliser de paramètres génériques pour créer des instances, c'est-à-dire que vous ne pouvez pas utiliser new E() 3 Les paramètres d'une classe ne peuvent pas être de types génériques dans un environnement statique (remarque) Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
Limite inférieure des génériques : super E > // Indique la réception du type de E, ou le type parent de E //这时这个函数只能接收 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, "猫"));
}
}