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。