这是来自第三方库API的真实示例,但已简化.
使用Oracle JDK 8u72编译
考虑这两种方法:
<X extends CharSequence> X getCharSequence() {
return (X) "hello";
}
<X extends String> X getString() {
return (X) "hello";
}
Run Code Online (Sandbox Code Playgroud)
两者都报告了"未经检查的演员"警告 - 我明白了.困扰我的是我为什么打电话
Integer x = getCharSequence();
Run Code Online (Sandbox Code Playgroud)
它编译?编译器应该知道Integer没有实现CharSequence.打电话给
Integer y = getString();
Run Code Online (Sandbox Code Playgroud)
给出错误(如预期的那样)
Run Code Online (Sandbox Code Playgroud)incompatible types: inference variable X has incompatible upper bounds java.lang.Integer,java.lang.String
有人可以解释为什么这种行为被认为是有效的?它会有用吗?
客户端不知道此调用是不安全的 - 客户端的代码在没有警告的情况下编译.为什么编译器不会警告/发出错误?
另外,它与这个例子有什么不同:
<X extends CharSequence> void doCharSequence(List<X> l) {
}
List<CharSequence> chsL = new ArrayList<>();
doCharSequence(chsL); // compiles
List<Integer> intL = new ArrayList<>();
doCharSequence(intL); // …Run Code Online (Sandbox Code Playgroud)