1

How Generics works in Java部分 它说

Java 编译器,当它看到使用泛型编写的代码时,它会完全擦除该代码并将其转换为原始类型,即没有泛型的代码。在擦除过程中,所有类型相关信息都会被删除。因此,您的 ArrayList 在 JDK 1.5 之前变成普通的旧 ArrayList,形式类型参数,例如,或者被类型的 Object 或 Super Class 替换。

我的问题是关于最后一行 - formal type parameters e.g. <K, V> or <E> gets replaced by either Object or Super Class of the Type

在哪种情况下它们被 Object 替换,在哪种情况下它们被对象类型的 Super Class 替换?

更新 :

当我们有如下通配符时会发生什么?

List<? extends Foo>
4

3 回答 3

2

您已经知道擦除是什么。擦除是写的|T|,所以|List<String>|也是List。类型变量,意味着形式类型参数的提及,被擦除到它们最左边的边界。形式类型参数的最一般形式TT extends A1 & A2 & ...,其中A1toAnTs 边界。

例如

public abstract class Copyable<T extends Copyable<T> & Cloneable> {
    public T copy() { /* ... */ }
}

内部T副本将被擦除到其最左边的边界。那就是|Copyable<T>| = Copyable

更简单的界限可能是

  • 单界class Enum<E extends Enum<E>>:最左边的界是单界,擦除是|Enum<E>| = Enum
  • 没有边界,如class ArrayList<E>:E确实有Object( class ArrayList<E extends Object>) 的隐式边界,所以擦除是|Object| = Object

编辑:如果List<? extends Foo>您要擦除整个内容;的擦除List<? extends Foo>|List|

于 2013-08-20T07:37:35.443 回答
1

在无界类型的情况下,List<T>擦除将是 type Object

在有界类型的情况下List<T extends Foo>,擦除将是Foo

于 2013-08-20T07:11:27.770 回答
0

假设您有一个名为

class Holder<T>{
   T obj;
}

类型擦除后,如下所示,原因Object替换无界泛型类型 T

class Holder{
   Object obj;
}

假设你有一个班级叫

class Holder<T extends Cloneable>{
   T obj;
}

类型擦除后它将是

class Holder{
   Cloneable obj;
}
于 2013-08-20T07:12:06.213 回答