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也可以

posted @ 2022-03-16 11:11  平凡晨  阅读(1513)  评论(0编辑  收藏  举报