泛型的学习

泛型深入

泛型:可以在编译阶段约束操作的数据类型,并进行检查

泛型的格式:<数据类型>

注意:泛型只能支持引用数据类型

//没有泛型的时候,集合如何存储数据

    //如果我们没有给集合指定类型,默认认为所有的数据类型都是Object类
    //此时可以在集合添加任意的数据类型
    //带来一个坏处,我们在获取数据的时候,无法使用他的特有行为
    
    //此时推出了泛型,可以在添加数据的时候,将数据类型统一
    //而且让我们获取数据的时候,也可以进行强转
    
    //1.创建集合
    ArrayList list = new ArrayList<>();

    //2.添加数据
    list.add(123);
    list.add("aaa");
    System.out.println(list);

    //3.遍历集合
    Iterator iterator = list.iterator();
    while (iterator.hasNext()){
        Object next = iterator.next();
        //多态的弊端是无法访问子类的特有功能
        System.out.println(next);
    }
}

泛型的好处

同意数据类型。把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来

Java中的泛型都是伪泛型

泛型的细节:

泛型中不能写基本数据类型

指定泛型的具体类型后,传递数据时,可以传入该类类型或者其子类类型

如果不写泛型,类型默认为Object

泛型可以在很多地方进行定义:

类后面        泛型类

当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类

/*
    当我在编写一个类的时候,不确定类型,那么这个类型就可以定义为泛型类
* */
public class MyGenerics {

    Object[] obj = new Object[10];
    int size;

    /*
    E: 表示不确定的类型,该类型在类名后面定义过
    
    * */
    public boolean add(E e) {
        obj[size] = 0;
        size++;
        return true;
    }

    public E get(int index) {
        return (E) obj[index];
    }

    @Override
    public String toString() {
        return Arrays.toString(obj);
    }
}

    public static void main(String[] args) {
        MyGenerics list = new MyGenerics<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        list.add("ddd");

//        System.out.println(list);

    }

方法上面        泛型方法

方法中形参的类型不确定时,可以使用类名后面定义的泛型

public class ListUtil {
    private ListUtil(){}

    //类中定义一个静态方法addAll,用来添加多个集合的元素
    /*
        参数一:集合
        参数二:元素
     */
    
    public static  void addAll(ArrayList list,E e,E e2,E e3,E e4){
        list.add(e);
        list.add(e2);
        list.add(e3);
        list.add(e4);
    }
}

public class Demo3 {
    public static void main(String[] args) {
        ArrayList list = new ArrayList<>();
        ListUtil.addAll(list, "a", "b", "c", "d");
        System.out.println(list);
    }
}

接口后面         泛型接口

如何使用?

方式1:实现类给出具体类型

泛型的学习_第1张图片

泛型的学习_第2张图片

方式2:实现类延续泛型,创建对象时在确定

你可能感兴趣的:(学习)