这看起来像是在此处和此处报告的已知兼容性问题。
从第二个链接:
以下在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。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)