Java类型推断:在Java 8中引用不明确,但在Java 7中不是

Java类型推断:在Java 8中引用不明确,但在Java 7中不是,第1张

Java类型推断:在Java 8中引用不明确,但在Java 7中不是

问题在于类型推断已得到改进。你有一个像

public <T extends base> T get() {    return (T) new Derived();}

基本上说“调用者可以决定base我返回哪个子类”,这显然是胡说八道。每个编译器都应(T)在此处针对你的类型转换发出未经检查的警告。

现在你有了一个方法调用:

set(new Derived(), new Consumer().get());

回想一下,你的方法

Consumer.get()
说“调用者可以决定我返回的内容”。因此,假设存在可以同时扩展base和实现的类型是完全正确的Collection。因此,编译器会说“我不知道该调用
set(base i, Derived b)
还是
set(Derived d, Collection<? extends Consumer> o)
”。

你可以通过调用来“修复”它,

set(new Derived(), new Consumer().<Derived>get())
;但是为了说明你的方法的疯狂之处,请注意,你也可以将其更改为

public <X extends base&Collection<Consumer>> void test() {    set(new Derived(), new Consumer().<X>get());}

现在将在

set(Derived d, Collection<? extends Consumer> o)
没有任何编译器警告的情况下进行调用。实际的不安全 *** 作发生在
get
方法内部。

因此,正确的解决方法是从get方法中删除类型参数,并声明其真正返回的值Derived。

顺便说一句,令我感到恼火的是,你声称该代码可以在Java 7下编译。它的有限类型推断和嵌套方法调用导致

get
在嵌套调用上下文中处理该方法,例如返回
base
,而该返回不能传递给方法。期待一个
Derived
。结果,尝试使用兼容的Java 7编译器来编译此代码也将失败,但是出于不同的原因。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5083957.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存