Hello,大家好,我是Yize,自从开学后,我的作息都变得不规律了哈哈哈,白天还要上课,晚上还要去实验室上晚自习,今天也是能抽出来时间与大家分享,一同进步,下面我们开始

今天要与大家分享的是关于集合的知识,首先今天会和大家分享一下泛型的知识,在后面我会从单列集合双列集合慢慢去与大家一起去探讨

目录

泛型入门

泛型类 泛型方法 泛型接口

作用(应用场景)


泛型入门

没有集合的时候:
集合在存储数据时,会默认所有数据类型都是 Object类型,此时虽然可以添加任意的数据类型,但最明显的 弊端就是在 获取数据时,无法使用它的特有行为
泛型的好处:
可以 统一数据类型
把运行时期的 问题提前到编译期间,避免了强制类型转换可能出现的异常,在编译阶段就能确定下来
泛型的细节:
泛型中不能写基本数据类型
指定泛型的具体类型后,在传递数据时,可以传入该类类型或者其子类类型
如果不写泛型,默认类型是Object

泛型类 泛型方法 泛型接口

泛型类:当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类
泛型方法:方法中形参类型不确定时,可以使用类名后面定义的泛型
public class MyArrayList{
    public <E> boolean add(E e){  /泛型方法/
        obj[size] = e;
        size++;
        return true;
    }
}
方法中形参类型不确定时:
1. 使用 类名后面定义的泛型
2. 在 方法申明上定义自己的泛型
泛型接口
两种使用方式:
实现类给出具体类型 (例如在一个类实现接口MyArrayList implement List时 直接 MyArrayList implement List
实现类延续泛型,创建实现类对象时再确定对象 (例如在一个类实现接口MyArrayList implement List时 直接 MyArrayList implement List,然后在创建实现类对象时: MyArrayList list = new MyArrayList<>()
泛型的继承和通配符
泛型不具备继承性,但是数据具备继承性
public class demo1{
    public static void main(String[] args){
        /创建集合的对象/
        ArrayList list1 = new ArrayList<>();
        ArrayList list2 = new ArrayList<>();
        ArrayList list3 = new ArrayList<>();
        
        /调用method方法/  /泛型不具备继承性/
        method(list1);
        method(list2);//这个会报错,因为泛型不具备继承性
        method(list3);//同样,这个也会报错
        
        /数据具备继承性/
        list1.add(new Ye());//以下三个就不会报错
        list1.add(new Fu());
        list1.add(new Zi());
        
        /创建方法/
        public static void method(ArrayList<Ye> list){
                    
        }
            
        class Ye{}
        class Fu extends Ye{}
        class Zi extends Fu{}
    }
}

那如果使用我们之前学习的泛型方法呢?
public class demo1{
    public static void main(String[] args){
        /创建集合的对象/
        ArrayList list1 = new ArrayList<>();
        ArrayList list2 = new ArrayList<>();
        ArrayList list3 = new ArrayList<>();
        
        /调用method方法/
        method(list1);
        method(list2);
        method(list3);
        
        /创建方法/
        public static<E> void method(ArrayList<E> list){------此时由于用的泛型方法,所以在上面调用method方法时不会报错
                                                        ------但有一个新的问题就是,此时它可以接受任意的数据类型,例如与Ye它们无关的Student学生类
        }                                               
        
        class Ye{}
        class Fu extends Ye{}
        class Zi extends Fu{}
    }
}

但是我们希望:虽然本方法不确定类型,我们仍希望它只能传递Ye Fu Zi
解决方案:使用泛型的通配符
泛型的通配符:(可以限定类型的范围)
? extends E:表示可以传递E以及E的所有子类类型
? super E:表示可以传递E以及E的所有父类类型
public class demo1{
    public static void main(String[] args){
        /创建集合的对象/
        ArrayList list1 = new ArrayList<>();
        ArrayList list2 = new ArrayList<>();
        ArrayList list3 = new ArrayList<>();
        
        /调用method方法/
        method(list1);
        method(list2);
        method(list3);
        
        /创建方法/
        public static void method(ArrayList<? extends Ye> list){------此时这样上面method方法在调用时就不会报错了
                                            ? super Zi
        }
            
        class Ye{}
        class Fu extends Ye{}
        class Zi extends Fu{}
    }
}

作用(应用场景)

  1. 如果我们在定义类,方法,接口时,数据类型不确定,就可以使用泛型类,泛型方法,泛型接口;
  2. 如果类型不确定,但我们已经知道只能传递某个继承体系中的时,就可以使用泛型的通配符
好啦,以上就是我们这篇学习的内容,如果大家有想了解或者有什么建议,希望可以多多发表评论,感谢大家的观看,我们下次见!!!
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐