泛型Java通配符和子类型

泛型Java通配符和子类型,java,generics,Java,Generics,我正在阅读Java atm中的泛型,事情进展得有点慢,希望能得到一些帮助。我从Oracles自己的数据库中读到: 在底部,我们可以看到List是List的一个子类型。您可以将对象强制转换为任何您想要的对象,但它可能在运行时失败。然而,由于泛型信息在运行时不存在,您的代码本质上变成了((列表)列表)。此时,列表将接受任何对象,而不仅仅是一个数字。泛型可以帮助您在编译时避免强制转换并保持类型安全,但在运行时它们不再重要。强制转换使编译器忽略了一个事实,即类型可能不可赋值 在运行时,类型参数并不重要

我正在阅读Java atm中的泛型,事情进展得有点慢,希望能得到一些帮助。我从Oracles自己的数据库中读到:


在底部,我们可以看到
List
List的一个子类型。您可以将对象强制转换为任何您想要的对象,但它可能在运行时失败。然而,由于泛型信息在运行时不存在,您的代码本质上变成了
((列表)列表)。此时,
列表
将接受任何对象,而不仅仅是一个
数字
。泛型可以帮助您在编译时避免强制转换并保持类型安全,但在运行时它们不再重要。

强制转换使编译器忽略了一个事实,即类型可能不可赋值

在运行时,类型参数并不重要,请参阅

ArrayList
在内部将内容存储在
Object[]
数组中,这意味着您可以在“滥用”强制转换时向列表对象添加任何引用类型

但是,在检索对象时可能会出现异常,因为
get
语句中隐藏了一个强制转换

例如:

List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
List<String> list2 = (List) list;
list2.add("Hello World");

Integer i = list.get(0); // works
String s = list2.get(3); // works
s = list2.get(1); // ClassCastException
i = list.get(3); // ClassCastException
List List=newarraylist(Arrays.asList(1,2,3));
列表2=(列表)列表;
列表2.添加(“你好世界”);
整数i=list.get(0);//作品
字符串s=list2.get(3);//作品
s=list2.get(1);//类卡斯特例外
i=列表。获取(3);//类卡斯特例外

谢谢你的回答。我稍后再看。没有类型的强制转换(列表)意味着什么?它是否等于您第二行的
list2=(List)(Object)List
?参考:谢谢你的回答。我待会再看。
import java.util.*;
class CastingWildcard{
    public static void main(String[] args){
        List<? extends Number> list = new ArrayList<Short>();
        int s=32770;
        ((List<Integer>)list).add((int) s);
        System.out.println(list.get(0));
    }
}
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
List<String> list2 = (List) list;
list2.add("Hello World");

Integer i = list.get(0); // works
String s = list2.get(3); // works
s = list2.get(1); // ClassCastException
i = list.get(3); // ClassCastException