展望另一个 题 我碰到了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()) {}
}
}
编译器 只要 在最后一个for循环失败:
error: incompatible types: Object cannot be converted to Integer
for (Integer i : rawAlpha.intList()) {}
^
1 error
尽管如此 intList()
返回列表类型 List<Integer>
在 Alpha
不依赖于类型参数 T
,似乎是 <Integer>
在编译时被删除。
请注意,如果我们声明一个非泛型接口 Beta
从理论上讲,这相当于参考原始数据 Alpha
,没有问题。
这是预期的行为吗?是否有人能指出涵盖这一点的语言规范段落?如果这不是一个错误,它至少看起来反直觉和非生产性;或许是为了背部可比性而做的?