最佳答案
这是一个来自第三方库 API 的实际示例,但是经过了简化。
使用 Oracle JDK 8u72编译
考虑以下两种方法:
<X extends CharSequence> X getCharSequence() {
return (X) "hello";
}
<X extends String> X getString() {
return (X) "hello";
}
两人都报告了一个“未经检查的铸造”警告-我知道为什么。困扰我的是为什么我可以打电话
Integer x = getCharSequence();
编译器应该知道 Integer
没有实现 CharSequence
Integer y = getString();
给出一个错误(如预期的)
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); // error
正如预期的那样,尝试传递 List<Integer>
会出现一个错误:
method doCharSequence in class generic.GenericTest cannot be applied to given types; required: java.util.List<X> found: java.util.List<java.lang.Integer> reason: inference variable X has incompatible bounds equality constraints: java.lang.Integer upper bounds: java.lang.CharSequence
如果报告为错误,为什么 Integer x = getCharSequence();
没有?