java泛型
1、什么是Java泛型 / 类型参数 / 什么是泛型类,接口,方法
答:自我总结(可自我发挥):
Java泛型是在JDK1.5引入的新特性,分为泛型类,泛型接口,泛型方法,它限定了类型参数,在编译时检测不一致的类型,避免运行时异常
类型参数(暂时就这么理解):将类型参数化,类似于方法中的变量参数,此时将类型定义成参数形式
泛型类: 在原始类名后面加一个类型参数,也就是将操作的数据类型指定为一个类型参数
泛型接口:泛型接口的定义和泛型一致
泛型方法: 在方法返回类型之前加一个类型参数
(静态的泛型方法,类型参数在 static 之后,方法返回类型之前。
泛型方法可以在普通类和泛型类中使用)
2、泛型的作用 / 泛型的好处 / 为什么要使用泛型(使用泛型有3大好处)
答:三大作用:
在编译时进行类型检查,防止类型不同,导致运行时异常
消除强制类型转换
增加代码的复用性
3、泛型擦除 / 类型擦除 / 什么是泛型擦除机制 / 泛型原理 / 泛型擦除原理 / java编译期是如何擦除泛型的 / 泛型是如何工作的
答:泛型依靠泛型擦除机制工作的,为了兼容jdk1.5以前的版本,编译期在编译时,首先进行类型检查,然后进行泛型擦除,所有的类型参数替换为它们的上(下)限,
如果有多个限定(T extends class1%class2),则使用第一个边界class作为原始类,
如果泛型类型没有限定(),则用object作为原始类型。
4、通配符 / 限定通配符 / 非限定通配符(无界通配符)/ PECS原则(难点) / 解释一下extends 和super 泛型限定符
答:非限定通配符:<?> 不限定类型参数
限定通配符分为上界通配符和下界通配符:
上界(限)通配符将未知类型限定为该类型或其子类型,使用 extends 关键字(? extends T)
下界(限)通配符将未知类型限定为该类型或其父类型,使用 super 关键字 (? super T)
PECS原则 (难点)
从集合中获取元素,则把这个集合看成生产者,使用上界通配符
增加元素到集合,把这个集合看成消费者,使用下界通配符
为什么上界通配符只能取?下界只能添加?
为什么下界反之?
上界通配符不能set,只能get
上界通配符主要用于安全访问数据
get的时候,因为规定了上界,get的一定是上界,java向上转型
set的时候,只知道是父类,至于是哪个子类,编译器不知道
下界通配符只能set,不能get
下界通配符主要用于安全放入数据
set的时候,能set下界或者下界的子类
get的时候编译器不知道是下界的哪个父类,故之
5、泛型擦除后为什么还能用反射
答:待研究
6、编写一段泛型程序来实现LRU缓存?(实战)
答:待研究
7、 更多问法:
1、List<? extends T>和List <? super T>之间有什么区别 ?
答:List<? extends T> 是上界通配符,标识类型参数是T或者T的子类
2、List 和 List < object >的区别?
答:编译时不会对原始类型进行类型安全检查,会对带类型参数的进行检查
3、List<?>和List< object >之间的区别是什么?
答:List<?> '?'无限定通配符,表示类型无限制,实质是未知类型的list,
List是任意类型的List
4、List<?> 与 List< T> 类型之间的区别?
答:
// T 传入一类对象
<T> void method0(List<T> list) {
System.out.println(list);
}
// ?可以传入多个对象
void method1(List<?> list) {
System.out.println(list);
}
5、Array中可以使用泛型吗
答:待研究
6、难点
Apple extends Fruit
然后有一个容器:Plate类
现定义一个“盘子”,一般人会认为装水果的 盘子 当然可以装苹果,
plate extends plate
但实际上Java编译器不允许这个操作
我们可以这样理解:
苹果 是 水果的子类(水果)
装苹果的盘子 不是 装水果的盘子 子类(盘子)
参考文章:https://mp.weixin.qq.com/s/aHmN5deBpZ88SMSN1ugcpA