开篇介绍
大家好,我是 Java 最全面试题库的提裤姐,今天这篇是面试系列的第六篇,主要总结了 JavaSE 中泛型
相关面试题,在后续,会沿着第一篇开篇的知识线路一直总结下去,做到日更!如果我能做到百日百更,希望你也可以跟着百日百刷,一百天养成一个好习惯。
什么是泛型?
Java 泛型(generics)是 JDK 5 中引⼊的⼀个新特性,允许在定义类和接口的时候使⽤类型参数(type parameter)。
声明的类型参数在使⽤时⽤具体的类型来替换。泛型最主要的应⽤是在 JDK 5 中的新集合类框架中。
泛型最⼤的好处是可以提⾼代码的复⽤性。以 List 接口为例,我们可以将 String、Integer 等类型放⼊ List 中,如不⽤泛型,存放 String 类型要写⼀个 List 接口,存放 Integer 要写另外⼀个 List 接口,泛型可以很好的解决这个问题。
什么是类型擦除?
通过类型参数合并,将泛型类型实例关联到同一份字节码上。
编译器只为泛型类型生成一份字节码,并将其实例关联到这份字节码上。
泛型是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息。例如 List 在运行时仅用一个 List 来表示。这样做的目的,是确保能和 Java 5 之前的版本开发二进制类库进行兼容。你无法在运行时访问到类型参数,因为编译器已经把泛型类型转换成了原始类型。
类型擦除的主要过程如下:
1. 将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。
2. 移除所有的类型参数。
List<?> 和 List<Object> 的区别?
List 是一个未知类型的 List,而 List 其实是任意类型的 List。
可以把 List, List 赋值给 List,却不能把 List 赋值给 List。
什么是泛型中的限定通配符和非限定通配符 ?
限定通配符 :
对类型进行了限制。有两种限定通配符:
一种是 它通过确保类型必须是 T 的子类来设定类型的上界,
另一种是它通过确保类型必须是 T 的父类来设定类型的下界。
泛型类型必须用限定内的类型来进行初始化,否则会导致编译错误。
非限定通配符 :
表示了非限定通配符,因为可以用任意类型来替代。
泛型中 K T V E?object 等的含义 ?
E – Element (在集合中使用,因为集合中存放的是元素)
T – Type(Java 类)
K – Key(键)
V – Value(值)
N – Number(数值类型)
?- 表示不确定的 java 类型(无限制通配符类型)
Object – 是所有类的根类,任何类的对象都可以设置给该 Object 引用变量,使用的时候可能需要类型强制转换,但是用使用了泛型 T、E 等这些标识符后,在实际用之前类型就已经确定了,不需要再进行类型强制转换。
编写一个泛型方法,让它能接受泛型参数并返回泛型类型 ?
public V put(K key, V value) {return cache.put(key, value);
}