查看另一个问题,我遇到了 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
请注意,如果我们声明一个在理论上相当于引用 raw的非泛型接口,Alpha
则没有问题。
这是预期的行为吗?有人可以指出语言规范中涵盖这一点的段落吗?如果这至少不是一个错误,那么它似乎相当反直觉和非生产性;也许是为了向后可比性而完成的?