在this的How 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>
答案 0 :(得分:2)
你已经知道擦除是什么了。删除时写为|T|
,因此|List<String>|
为List
。类型变量,即正式类型参数的提及,将被删除,以删除它们最左边的边界。形式类型参数T
的最一般形式是T extends A1 & A2 & ...
,其中A1
到An
是T
的边界。
例如
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>
)的隐式约束,因此删除为{{ 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;
}