Java如何做到这一点?如果没有创建多个类,那么它如何支持Generic类的多个Typed实例化?
到目前为止,我以前一直认为它就像C++,但是现在我完全感到困惑。
无法弄清楚Java如何实现这一目标?

-阿杰

最佳答案

由于在Java中只能将引用类型用作泛型类型参数,并且所有指针的大小都相同,因此可以使用相同的字节码。

至于类型安全性,Java中的泛型仅是编译/链接时。也就是说,在编译过程中,通用类型将被其擦除替换。类型变量T的擦除是其下限(如果没有,则为Object)。例如,

class Complex<N extends Number> {
    N real;
    N imag;
}

变成
class Complex {
    Number real;
    Number imag;
}

就字节码而言。

不用说那不是很漂亮,并且会导致很多限制。最明显的是
new N();

不编译,因为运行时不知道N代表类型,因此无法初始化该类型。同样,
(N) n

将进行编译,但与Java中的常规强制转换不同,它将不会在运行时进行检查。因此,不正确的转换可能导致变量保存错误类型的对象。这称为堆污染。为了确保(较弱的形式)类型安全,编译器会将强制转换引入调用代码。例如,
boolean right(Complex<Integer> c) {
    return c.real > 0;
}

会变成
boolean right(Complex c) {
    return ((Integer) c.real) > 0;
}

综上所述,Java中的泛型实现并不理想,特别是与.NET相比。为了向后兼容,我们必须忍受的东西...

07-24 09:49
查看更多