Maison  >  Article  >  Java  >  Explication détaillée d'exemples de génériques en Java

Explication détaillée d'exemples de génériques en Java

零下一度
零下一度original
2017-06-30 10:10:591264parcourir

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 c)

2.TreeSet(Comparator 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 : Type, ou sous-type de E
Limite inférieure des génériques : // Indique la réception du type de E, ou le type parent de E

Exemple de code :

//这时这个函数只能接收 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"

(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

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();
    }
}
<.>

2. Méthodes génériques

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, "猫"));
    }
}

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()

2. Les classes d'exception ne peuvent pas être génériques

3 Les paramètres d'une classe ne peuvent pas être de types génériques dans un environnement statique (remarque)

Étant donné que toutes les instances d'un générique. class are Il existe la même classe d'exécution, donc les variables statiques et les méthodes de la classe générique sont partagées par toutes ses instances. Puisqu'il est partagé, il n'est pas nécessaire de redéfinir le même type générique. Si vous ne définissez pas le même type générique et ne parvenez pas à réaliser le partage (ou la cohérence), il n'est pas nécessaire de laisser passer cette situation. Par conséquent, il est illégal de définir des paramètres de classe sur des génériques dans un environnement statique.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn