考虑以下代码示例:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List list = new ArrayList<Integer>();
String response = getProducer(list).get();
}
static Producer<String> getProducer(List<Integer> list) {
return new Producer<String>();
}
}
class Producer<T> {
T get() {
return null;
}
}
用Java 7编译时,它只会对
getProducer(list)
产生预期的警告:但是,当使用Java 8进行编译时,会为
response = getProducer(list).get()
分配产生以下错误:因此,显然从
getProducer(list)
返回的类型不是Producer<String>
,而是擦除的Producer
(也可以通过IDE中的“提取变量”功能确认)。这非常令人困惑,因为getProducer
方法始终返回Producer<String>
。奇怪的是,可以通过在调用
getProducer
方法时避免未经检查的转换来解决此问题,方法是:getProducer
的参数类型从List<Integer>
更改为List
list
变量的类型从List
更改为List<Integer>
更新
问题
最佳答案
这看起来像一个已知的兼容性问题here和here。
从第二个链接:
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);
}
}
因此,可以通过替换此行来固定OP的代码(右侧的类型声明使我失望-我将其视为不是类型化数组列表的形式阅读):
List list = new ArrayList<Integer>();
与
List<Integer> list = new ArrayList<Integer>();
这不会导致从方法
getProducer(List<Integer> list)
的返回类型中删除类型再次引用第二个链接: