【发布时间】:2017-03-28 18:05:25
【问题描述】:
查看另一个question 我偶然发现了 1.8.0_112 Sun-Oracle 编译器的这种有趣行为(我没有与其他人一起测试过):
import java.util.List;
interface Alpha<T> {
List<Integer> intList();
}
interface Beta {
List<Integer> intList();
}
class Main {
public static void main(String[] args) {
Alpha rawAlpha = null;
Alpha<Character> charAlpha = null;
Alpha<?> qmAlpha = null;
Beta beta = null;
for (Integer i : charAlpha.intList()) {}
for (Integer i : qmAlpha.intList()) {}
for (Integer i : beta.intList()) {}
for (Integer i : rawAlpha.intList()) {}
}
}
编译器only在最后一个for循环失败:
error: incompatible types: Object cannot be converted to Integer
for (Integer i : rawAlpha.intList()) {}
^
1 error
因此,尽管Alpha 中的intList() 返回列表类型List<Integer> 不依赖于类型参数T,但似乎<Integer> 在编译时已被删除。
请注意,如果我们声明一个非泛型接口Beta,理论上这相当于引用原始Alpha,则没有问题。
这是预期的行为吗?有人可以指出语言规范中涵盖这一点的段落吗?如果这至少不是一个错误,那么它似乎相当反直觉和非生产性;也许是为了向后可比性而完成的?
【问题讨论】:
-
当泛型类型被用作原始类型时,它会丢失它的所有泛型,而不仅仅是那些依赖于您没有提供的类型的泛型。
-
@PeterLawrey 是的,似乎是这样,但问题是为什么?
-
我在 Java 5.0 发布时询问了一位开发人员,在我看来,没有太多资源可以解决问题,除了它是向后兼容的原始类型或这是一个通用的。没有有点生硬,但仍然有一些理智的后备。
-
为什么?为什么,因为 JLS 是这么说的,当然!
-
即使在 11 年前,人们已经认识到稀有类型可能是答案。也许他们会在 Java 10 中。
标签: java generics type-erasure erasure