泛型简单理解

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

泛型

1.作用:

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

2.使用场景:

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

3.类型擦除:

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

泛型简单理解_第1张图片
image.png

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

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

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

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

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

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

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

ArrayList animals = ArrayList();
不能用add(item)

ArrayList fruits = ArrayList();
不能用get(item)

6.泛型方法:

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

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

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

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

void someMethod(E param)

8.通配符

image.png

如上图所示, List不能add,get出来也是Object类型。它同时具有协变和逆变的两种性质,也有两者的限制。
在kotlin中 *等同于,Java中的 ?Any等同于 Object
泛型简单理解_第3张图片
image.png

参考 https://blog.csdn.net/yasinshaw/article/details/111878133

kotlin中泛型

  • 泛型简单理解_第4张图片
    image.png

    out代替Java重的? entends T 。我们能够将使用子类泛型的对象赋值给使用父类泛型的对象。

  • 泛型简单理解_第5张图片
    image.png

    in代替 java中的? super T。我们可以将使用父类泛型的对象赋值给使用子类泛型的对象

  • 泛型简单理解_第6张图片
    image.png

你可能感兴趣的:(泛型简单理解)