Java中的泛型/类型擦除/通配符

wuchangjian2021-11-03 23:59:27编程学习

1.泛型是如何工作的?

泛型是通过类型擦除来实现的.
编译器在编译时,擦除了所有类型相关的信息.
运行时不存在任何类型相关的信息.
例如:List 在运行时仅用一个 List 来表示。
这样做的目的,是确保能和 Java 5 之前的版本开发二进制类库进行兼容。

2.什么是类型擦除?

泛型信息只存在于代码编译阶段,在进入JVM 之前,与泛型相关的信息会被擦除掉,专业术语叫做类型擦除。
在泛型类被类型擦除的时候,,如果类型参数没有指定上限,如 < T > 会被转译成普通的 Object 类型,如果指定了上限如 < T extends String > 则类型参数就被替换成类型上限。

3.List list = new ArrayList();

  • 两个 String 只有第一个起作用,只不过JDK7 才开始支持 List list=new ArrayList<> ();这种写法。
  • 第一个String就是告诉编译器,List 中存储的是String对象,也就是起类型检查的作用,之后编译器会擦除泛型占位符,以保证兼容以前的代码。

4.泛型中的限定通配符和非限定通配符

  • < ? > 表示了非限定通配符,因为 < ? > 可以用任意类型来替代。

限定通配符对类型进行了限制。有两种限定通配符.

  • < ? extends T > 通过确保类型必须是T的子类来设定类型的上界,
  • < ? super T >通过确保类型必须是T的父类来设定类型的下界。

List< ? extends T > 可以接受任何继承自 T 的类型的 List,
List < ? super T > 可以接受任何 T 的父类构成的 List。

例如 List< ? extends Number > 可以接受 List< Integer > 或 List< Float > 。
Array 不支持泛型,要用List 代替 Array,List 可以提供编译器的类型安全保证,而 Array却不能。

泛型类型必须用限定内的类型来进行初始化,否则会导致编译错误。

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。