学习总结,仅供自己参考,如有不对欢迎指正
泛型
1.作用:
1.不需要再进行类型转化
2.保证ClassCastException的异常,可以在编译器全部暴露出来
2.使用场景:
一个类或者接口,他的成员变量和方法的类型是不固定的。
3.类型擦除:
作用:避免过多的创建类而造成的运行时的过度消耗
利用类型擦除的原理,用反射的手段就绕过了正常开发中编译器不允许的操作限制。
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中泛型
-
image.png
out
代替Java重的? entends T 。我们能够将使用子类泛型的对象赋值给使用父类泛型的对象。 -
image.png
in
代替 java中的? super T。我们可以将使用父类泛型的对象赋值给使用子类泛型的对象 - image.png
网友评论