问题
在 v2 遇到有同学反馈了个问题, 第一眼的感觉应该是泛型擦除(Type Erasure)和类型推断(Type Inference)导致的. 但当我尝试去彻底解释这个问题的时候, 才发现关键原因是: 如果在调用方法时有 unchecked conversion, 那么方法返回的是定义中返回类型经过擦除(erasure)后的结果.
具体问题是这个样子的:
public static List<String> methodA(Collection<String> stringCollection) {
List<String> stringList = new ArrayList<>();
for (String s : stringCollection) {
stringList.add(s);
}
return stringList;
}
public static void methodB(String s) {}
public static void main(String args[]) {
// ok
methodA((Collection<String>) new ArrayList<String>()).stream().forEach(p -> methodB(p));
// compile error
// Question.java:29: 错误: 不兼容的类型: Object无法转换为String
// methodA((Collection) map.get("A")).stream().forEach(p -> methodB(p));
// ^
methodA((Collection) new Arr