为什么 ArrayList<T> 可以分配给 ArrayList<Integer>


public class Demo {
public static void main(String[] args) {
ArrayList<Integer> list = getList();
System.out.println(list.toString());
list.add(1);
System.out.println(list.toString());
}
public static <T> ArrayList<T> getList(){
ArrayList<String> strings =  new ArrayList<>();
strings.add("qwert");
return (ArrayList<T>) strings;
}
}

正如上面显示的代码,为什么允许分配给ArrayListJDK11输出

[qwert]
1

为什么ArrayList<T>可以分配给ArrayList<Integer>

这是因为您提供了显式的类型转换。

也许,你无法理解的是ArrayList<Integer> list是如何容纳qwert的。同样,这是因为你已经要求编译器信任你,所以你将Integer放入其中

最终,所有类型信息在运行时都会被删除。您需要了解类型擦除的概念。

return (ArrayList<T>) strings;

这里,String ArrayList不是直接被强制转换为Integer ArrayList,而是强制转换为T ArrayList。根据文档中的"目标类型推断":

static <T> List<T> emptyList();
List<String> listOne = Collections.emptyList();

此语句需要List的实例;此数据类型是目标类型。由于方法emptyList返回List类型的值,因此编译器推断类型参数T必须是值String。

最新更新