如果在Java 8中对方法参数进行未经检查的转换,为什么会删除返回类型的泛型?

如果在Java 8中对方法参数进行未经检查的转换,为什么会删除返回类型的泛型?,第1张

如果在Java 8中对方法参数进行未经检查的转换,为什么会删除返回类型的泛型?

这看起来像是在此处和此处报告的已知兼容性问题。

从第二个链接:

以下在JDK 7中编译并带有警告的代码将不会在JDK 8中编译:

import java.util.List;class SampleClass {     static class Baz<T> {         public static List<Baz<Object>> sampleMethod(Baz<Object> param) {  return null;         }     }     private static void bar(Baz arg) {         Baz element = Baz.sampleMethod(arg).get(0);     }}

在JDK 8中编译此代码会产生以下错误:

SampleClass.java:12:错误:不兼容的类型:无法将对象转换为Baz

Baz element = Baz.sampleMethod(arg).get(0);

注意:SampleClass.java使用未经检查或不安全的 *** 作。注意:使用-Xlint:unchecked重新编译以获取详细信息。1个错误

因此,可以通过替换此行来固定OP的代码(右侧的类型声明使我失望-我将其视为不是类型化数组列表的形式阅读):

List list = new ArrayList<Integer>();

List<Integer> list = new ArrayList<Integer>();

这不会导致类型从方法的返回类型中删除

getProducer(List<Integer> list)

再次引用第二个链接:

在此示例中,将原始类型传递给

sampleMethod(Baz<Object>)
可通过子类型化应用的 方法(请参见JLS,Java SE 7
Edition,第15.12.2.2节)。要应用该方法,必须进行未经检查的转换,因此将删除其返回类型(请参见JLS,Java SE 7
Edition,第15.12.2.6节)。在此情况下的返回类型
sampleMethod(Baz<Object>)

java.util.List
代替
java.util.List<Baz<Object>>
并因此返回类型
get(int)
Object
,这是不分配兼容
Baz




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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存