【问题标题】:Object array to generic array对象数组到通用数组
【发布时间】:2014-09-05 20:03:47
【问题描述】:

查看代码

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

这显然行不通,我完全理解。

但为什么使用泛型有效?

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

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

【问题讨论】:

标签: java arrays generics


【解决方案1】:

但为什么使用泛型有效?

这是因为泛型版本被类型擦除并编译为以下 -

Object[] array = new Object[size];

【讨论】:

  • SomeClass> { T[] 数组; } 将被转换为 Comparable[] 数组;对吗?
  • 刚刚在我的 Eclipse 上编译了它,它是 java.lang.Comparable[] array;
  • 你可以在这里得到它背后的想法 - What is a reifiable type?
【解决方案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。

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    相关资源
    最近更新 更多