参见代码
Integer[] array = (Integer[]) new Object[size];
这显然不起作用,我完全理解。
但为什么泛型有效?
T[] array = (T[]) new Object[size];
如果T是Integer类,那么在该行之后数组将是Object []类型,但是为什么可以进行强制转换呢?不抛出ClassCastException?
答案 0 :(得分:3)
但为什么泛型有效?
这是因为通用版本被类型擦除并编译为以下 -
Object[] array = new Object[size];
答案 1 :(得分:2)
类型转换是在运行时完成的,这就是你获得强制转换异常的原因。另一方面,泛型是Java的编译时特性。当你宣布
时class Foo<T> {
T bar;
}
字段栏实际上是Object类型(或者如果您使用的边界类似于?extends ...您选择的任何基类)。当你像这样使用类时
Foo<Foobar> foo = new Foo<>();
foo.bar = new Foobar();
Foobar foobar = foo.bar;
编译器会将最后一个赋值转换为等同于
的赋值Foobar foobar = (Foobar) foo.bar;
因为它知道返回值,即使在Object类型内部也总是一个Foobar。