java中的泛型(自定义泛型)

引出问题

  • 当我们在集合中加入数据的时候想要对数据进行约束。比如:就想传入自己创建的对象
  • 遍历的时候,需要进行类型转换,如果结合中的数据量较大,对效率有影响
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    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 , ..> {   成员  } 
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    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 @   平凡晨  阅读(1523)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示