java - 为什么可以从 Java 中的参数化列表中取回 "incorrect-type"的对象?

标签 java generics raw-types parameterized-types

这是一个代码片段:

import java.util.*;
class Test
{
    public static void main(String[] args)
    {
        List<Integer> list = new ArrayList<>();
        addToList(list);
        Integer i = list.get(0); //#1 fails at run-time
        String s = list.get(0); //#2 fails at compile-time
        list.get(0); //#3 works fine
        System.out.println(list.get(0)); //#4 works fine, prints "string"
    }
    static void addToList(List list){
        list.add("string");
    }
}

我明白为什么可以在参数化列表中插入 String 类的对象。

我好像明白为什么标有 #1#2 的代码会失败。

但为什么 #3#4 有效?据我了解,编译器在类型删除之后添加了适当的强制转换,所以当我调用 list.get(0) 时,此方法应该返回一个之前强制转换为 Integer 的 Object。那么为什么在运行时 #3 和 #4 没有 ClassCastException 发生呢?

最佳答案

#3 有效,因为 get(int) 返回的对象被忽略。存储在 0 位置的任何内容都会返回,但由于没有强制转换,因此不会发生错误。

#4 出于同样的原因可以正常工作:get(0) 生成的对象被视为 println< 中的 java.lang.Object 子类,因为 toString 被调用。由于 toString() 可用于所有 Java 对象,因此调用完成时不会出错。

关于java - 为什么可以从 Java 中的参数化列表中取回 "incorrect-type"的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28859646/

相关文章:

c# - 如何在接口(interface)上创建一般约束属性?

java - 什么是原始类型,为什么我们不应该使用它呢?

generics - 为什么 openjdk 使用不安全的构造?

Java:联合数组

java - 进度条没有动画

java - 我试图添加一个 try catch 告诉用户他们不能插入负数

java - 关于并行运行线程并在之后返回

返回 Class<T extends Somethng> 实例的 java 方法

Java泛型/抽象/内部类语法问题

java - 意外地将字符串添加到 List<Integers>