java中的泛型(自定义泛型)
引出问题
- 当我们在集合中加入数据的时候想要对数据进行约束。比如:就想传入自己创建的对象
- 遍历的时候,需要进行类型转换,如果结合中的数据量较大,对效率有影响
-
import java.util.*; public class text { public static void main(String[] args) { // ArrayList<Dog> 解释:如果指定泛型 这个ArrayList集合中只能传入Dog对象 ArrayList<Dog> AL = new ArrayList<>(); AL.add(new Dog("小黄",3)); //会报错,因为已经指定ArrayList中传入的类型了 AL.add(new Cat("小黑",3));//这里会报错 } } class Dog{ private String name; private int age; public Dog(String name, int age) { this.name = name; this.age = age; } } class Cat{ private String name; private int age; public Cat(String name, int age) { this.name = name; this.age = age; } }
泛型的好处
- 编译时,可以检查添加数据的类型,提高了安全性
- 减少了类型转化的次数,提高效率
泛型的注意事项
- 泛型只能是引用数据类型:Integer✅ int ❌
- 再给泛型指定具体类型后,可以传入该类型或继承该类型的子类
- 指定泛型可以是接口类型
自定义泛型(创建自己的类,自己定义泛型)
- 基本语法:class 类名<T , R , ..> { 成员 }
-
public class text { public static void main(String[] args) { //当创建对象了,指定了 T 是Integer R是 String Dog<Integer, String> dog = new Dog<>(); } } class Dog<T,R>{ String name; //以下表示正确,需要在创建的时候指定类型 T age; R gender; public String getName() { return name; } public void setName(String name) { this.name = name; } public T getAge(R r) {//方法返回值可以是自定义泛型,形参也可以是泛型 return age; } public void setAge(T age) { this.age = age; } public R getGender() { return gender; } public void setGender(R gender) { this.gender = gender; } }
- 如果在创建是不指定 T 和 R 的类型 ,默认是Object
- 普通成员可以使用泛型(属性,方法)
- 使用泛型数组不能初始化,T[ ] t = new [8] ❌。 因为类型不确定,不知道开多大空间
- 静态方法不能使用泛型,静态属性同样,因为静态是和类相关的,在类加载时,对象还没有创建
泛型的继承和通配符
泛型不具备继承性。例如:List< Object > list = new ArrayList<String>( ); ❌ 错误,不具备继承
< ? >可以接受任意泛型类型
< ? extends AA>:表示可以接受AA类,或AA子类类型
< ? super AA>:表示可以接受AA类,和AA类的父类,Object也可以