Java 泛型 - 原始类型和参数化类型转换

Mic*_*el1 5 java generics raw-types

我一直在阅读 Java 泛型教程和 Stackoverflow 中处理泛型的一些线程,但仍然无法理解特定的情况。这里是:

public class Box<T>
{
    private T t;

    public T getT ()
    {
        return t;
    }

    public void setT (T t)
    {
        this.t = t;
    }

    public static void main (String[] args)
    {
        Box<Integer> intBox = new Box<Integer>();
        Box rawBox = intBox;
        rawBox.setT("NBA");
        System.out.println(rawBox.getT());
        System.out.println(intBox.getT());
        /*1*/ //System.out.println(intBox.getT().toString());
    }
}
Run Code Online (Sandbox Code Playgroud)

这是交易,我理解的第一个打印,也就是说,

 System.out.println(rawBox.getT());
Run Code Online (Sandbox Code Playgroud)

打印 NBA,因为 rawBox 是 Box T 的原始类型,它“给出”我们对象。

我没有得到的是第二次打印:

System.out.println(intBox.getT());
Run Code Online (Sandbox Code Playgroud)

打印 NBA. intBox 是一个泛型类型(在本例中为 Box of Integers),这意味着它的 getter 方法应该返回类型 T 的值(在本例中为 Integer),所以我的理解是保存在那里的 String 对象应该被转换到 Integer(因为这是赋予 Box T 的参数类型)并且应该在运行时引发 ClassCastException,但它没有发生,为什么呢?

顺便说一句,注释号 / 1 / 增加了混乱,因为如果我取消注释它,它将导致 ClassCastException 在运行时引发(字符串无法转换为整数),我不明白

谢谢大家:)

Jan*_*jse 1

类型擦除就是原因。在运行时,所有 Box 实例都是相等的,它们都包含引用。泛型只会让程序员受益,因为它可以传达类型信息并使程序保持良好的类型。