泛型简单理解

2020-12-31  本文已影响0人  浩仔_Boy

学习总结,仅供自己参考,如有不对欢迎指正

泛型

1.作用:

1.不需要再进行类型转化
2.保证ClassCastException的异常,可以在编译器全部暴露出来

2.使用场景:

一个类或者接口,他的成员变量和方法的类型是不固定的。

3.类型擦除:

作用:避免过多的创建类而造成的运行时的过度消耗

image.png

利用类型擦除的原理,用反射的手段就绕过了正常开发中编译器不允许的操作限制。

4.泛型上界(协变)和下界(逆变)

List<? extends Animal> animals = new LinkedList<A>();
A可以是Animal及其子类,Animal是A的上界。,从集合中取出一个去个元素拿来消费。

List<Cat>并不是List<Animal>的子类型,但Java通过其它方式来支持了泛型的协变,List<Cat>是List<? extends Animal>的子类型

// A可以是Cat及其父类,Cat是A的下界
List<? super Cat> cats = new LinkedList<A>();

? Entends T 表示该集合中存在的都是类型T的子类,包括T自己。
? Super T 表示该集合中存的都是类型T的父类,包括T自己。

5.? Entends T 和 ? Super T的区别

ArrayList<? extends Animal> animals = ArrayList<Dog>();
不能用add(item)

ArrayList<? super Dog> fruits = ArrayList<Animal>();
不能用get(item)

6.泛型方法:

泛型类在实例化的时候就需要指定类型,即T是什么。泛型方法则可以在该方法被调用的时候才进行实例化,更加灵活。

public interface AnimalShop<T>{
    <E> E getAnimal(String type)
    //可以用来限制方法的类型之间的关系
    <E> void addToList(E item ,List<E> list){
    }
}

类型推断:
赋值时类型推断 函数默认会进行推断 返回值的属性推断
比如findViewById

7.对一个对象类型进行多重限制

<E extends Runnable & Serializable> void someMethod(E param)

8.通配符

image.png
如上图所示,List<?>不能add,get出来也是Object类型。它同时具有协变和逆变的两种性质,也有两者的限制。
在kotlin中*等同于,Java中的?Any等同于Object
image.png
参考 https://blog.csdn.net/yasinshaw/article/details/111878133

kotlin中泛型

上一篇 下一篇

猜你喜欢

热点阅读