对象数组到通用数组

时间:2014-09-05 20:03:48

标签: java arrays generics

参见代码

Integer[] array = (Integer[]) new Object[size];

这显然不起作用,我完全理解。

但为什么泛型有效?

T[] array = (T[]) new Object[size];

如果T是Integer类,那么在该行之后数组将是Object []类型,但是为什么可以进行强制转换呢?不抛出ClassCastException?

2 个答案:

答案 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。