泛型返回类型上限 - 接口与.class - 令人惊讶的有效代码
这是来自第三方库 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();