展望另一question我撞到了1.8.0_112太阳甲骨文编译器的这个有趣的行为(我还没有与其他人进行测试):为什么使用原始类型变量会影响签名而不参考类型参数?
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()) {}
}
}
编译器只在最后失败的循环:
error: incompatible types: Object cannot be converted to Integer
for (Integer i : rawAlpha.intList()) {}
^
1 error
所以尽管intList()
返回列表类型List<Integer>
在Alpha
不依赖于类型参数T
,似乎<Integer>
是时代在编辑时编辑。
请注意,如果我们声明一个非通用接口Beta
,理论上相当于参考原始Alpha
,则不存在任何问题。
这是预期的行为?有人可以指出语言规范中涉及这一点的段落吗?如果这不是一个错误,它至少看起来反直觉和非生产性;也许是为了后向可比性而完成的?
当一个泛型类型被用作原始类型时,它将失去所有它的泛型,而不仅仅是那些依赖于你没有提供的类型的泛型。 –
@PeterLawrey是的,这似乎是这种情况,但问题是为什么? –
在Java 5.0发布时,我问过其中一位开发人员,在我看来,除了向后兼容的原始类型或通用类型之外,没有太多的资源来处理这些情况。没有一点原始的,但仍然是一个理智的后备。 –