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相比。为了向后兼容,我们必须忍受的东西...