泛型中类型擦除的内部功能

时间:2013-08-20 07:01:27

标签: java generics type-erasure

thisHow Generics works in Java部分,它说

  

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

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

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

更新:

当我们拥有如下的外卡时会发生什么?

List<? extends Foo>

3 个答案:

答案 0 :(得分:2)

你已经知道擦除是什么了。删除时写为|T|,因此|List<String>|List。类型变量,即正式类型参数的提及,将被删除,以删除它们最左边的边界。形式类型参数T的最一般形式是T extends A1 & A2 & ...,其中A1AnT的边界。

例如

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实际上有Objectclass ArrayList<E extends Object>)的隐式约束,因此删除为{{ 1}}。

编辑:如果是|Object| = Object,您将删除整个内容; List<? extends Foo>的删除是List<? extends Foo>

答案 1 :(得分:1)

如果是无界类型List<T>,则删除类型为Object

如果是有界类型List<T extends Foo>,则删除将为Foo

答案 2 :(得分:0)

假设您有一个名为

的课程
class Holder<T>{
   T obj;
}

类型删除之后,如下所示,因为Object替换无界通用类型 T

class Holder{
   Object obj;
}

假设你有一个名为

的班级
class Holder<T extends Cloneable>{
   T obj;
}
类型删除之后

将是

class Holder{
   Cloneable obj;
}