JAVA中泛型机制

    技术2024-04-09  88

    JAVA中泛型(Generic)机制

    自JDK5.0后推出的新特性:泛型

    泛型这种语法机制,只在程序编译阶段起作用,只是给编译器参考的

    先定义一个动物类用于测试:

    使用泛型的好处: 1、集合中存储的元素统一了 2、从集合中取出的元素类型是泛型指定的类型,不需要进行大量的“向下转型”

    泛型的缺点:导致集合中存储的元素缺乏多样性

    大多数业务中,集合中元素的类型还是统一的,所以泛型特性得到了认可

    先创建一个动物类以便测试 public class Animal{ public void move(){ System.out.println("动物在移动"); } } class Cat extends Animal{ public void catchMouse(){ System.out.println("猫抓老鼠"); } } class Bird extends Animal{ public void fly(){ System.out.println("鸟儿在飞翔"); } } 不使用泛型机制:(next()方法输出的是Object类型,调用Animal类的方法需要向下转型) import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class GenericTest01 { public static void main(String[] args) { //创建ArrayList集合对象 List l = new ArrayList(); //添加元素 l.add(new Animal()); l.add(new Cat()); l.add(new Bird()); //遍历 Iterator it = l.iterator(); while (it.hasNext()){ Object o = it.next(); //调用cat 和 bird的特有方法,需要向下转型 if (o instanceof Cat){ Cat cat = (Cat)o; cat.catchMouse(); } if (o instanceof Bird){ Bird bird = (Bird)o; bird.fly(); } } } } 使用泛型机制<>之后 import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class GenericTest02 { public static void main(String[] args) { //创建ArrayList集合对象 使用了泛型<> List<Animal> l = new ArrayList<Animal>(); //添加元素 l.add(new Animal()); l.add(new Cat()); l.add(new Bird()); //类型不匹配 // l.add("abc"); //遍历 使用了泛型<> Iterator<Animal> it = l.iterator(); while (it.hasNext()){ //此时.next()方法输出的是Animal类型数据 Animal a = it.next(); //调用cat 和 bird的特有方法,仍然需要向下转型 if (a instanceof Cat){ Cat cat = (Cat)a; cat.catchMouse(); } if (a instanceof Bird){ Bird bird = (Bird)a; bird.fly(); } } } } 使用泛型机制后,.next()方法输出的是Animal类型数据

    泛型的自动类型判断机制:

    自JDK8之后加入了:自动类型判断机制(又称为钻石表达式)

    与上方泛型机制写法基本相同,就是声明集合对象的<>里置空。

    //创建ArrayList集合对象 //ArrayList<这里的类型会自动判断> List<Animal> l = new ArrayList<>();

    自定义泛型:

    自定义泛型: 定义类时,类名后加<>,<>中可以随便填,只是一个标识符 方法名后的参数列表也加标识符,参数列表中的数据类型填的标识符与类名后<>中的一致JDK源码中一般出现的是 E 和 T ,E表示element,T表示type public class GenericTest04<E> { public void doSome(E e){ System.out.println(e); } public static void main(String[] args) { //泛型<>选定要输入的数据类型 GenericTest04<String> g = new GenericTest04<>(); g.doSome("String"); } } doSome方法形参列表变为了String类型
    Processed: 0.010, SQL: 9