Java 从整数列表打印字符串';s指数

Java 从整数列表打印字符串';s指数,java,generics,raw-types,Java,Generics,Raw Types,我正在运行这段代码: List<String> abc = new ArrayList<String>(); abc.add("something"); List raw = abc; List<Integer> def = raw; System.out.println(def.get(0)); List abc=new ArrayList(); 添加(“某物”); 列表原始=abc; 列表定义=原始; System.out.println(def.get

我正在运行这段代码:

List<String> abc = new ArrayList<String>();
abc.add("something");
List raw = abc;
List<Integer> def = raw;
System.out.println(def.get(0));
List abc=new ArrayList();
添加(“某物”);
列表原始=abc;
列表定义=原始;
System.out.println(def.get(0));

我不明白当包含
字符串
成员的列表被分配给
整数
列表时,它为什么不抛出异常。此外,
整数
列表如何存储和打印
字符串
?有人能帮我一下吗?

这就是你不应该使用原始类型的原因

当你这样做的时候

List raw = abc;
你自己用列表删除类型。所以它们没有类型,也没有编译器的错误。为了获得泛型的好处,应该避免使用原始类型

也要考虑阅读。在运行时,列表不知道它们的类型。类型被删除,它们只得到列表中可用的任何内容

您预期的错误是编译器错误,同时您避免先给出类型。因此没有错误

如果确实希望看到异常,请尝试将当前列表中的元素指定给整数。虽然编译器不会给您任何错误,但在运行时,类型会匹配,您会遇到异常

如果你看一看,你会看到几乎相同的例子

Box<String> stringBox = new Box<>();
Box rawBox = stringBox;
rawBox.set(8);  // warning: unchecked invocation to set(T)
Box-stringBox=newbox();
Box-rawBox=stringBox;
rawBox.set(8);//警告:未选中的设置调用(T)
警告显示原始类型绕过泛型类型检查,将不安全代码的捕获延迟到运行时。因此,应该避免使用原始类型


当您写入
System.out.println(def.get(0))
从ArrayList中获取第一个元素,并将其传递到
System.out.println

我猜您会遇到异常,因为
def.get(0)
应该返回一个
整数
,尽管它在运行时实际返回一个
字符串
。但是
System.out.println
接受
对象
,它既接受
字符串
,也接受
整数
,参数的类型与方法无关。这意味着在运行时,在尝试将返回值传递到方法之前,不会对其进行强制转换

仅当您试图将
get
返回的值实际存储到
Integer
类型的变量中,或调用带有
Integer
类型参数的方法,从而导致强制转换时,才会导致异常:

System.out.println(def.get(0)); // works
Integer integer = def.get(0); // java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
doSomething(def.get(0)); // java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer

private static void doSomething(Integer i) {}