为什么不能将Objects数组转换为泛型类的泛型子类的数组?

火箭飞船

此代码有效。它会编译并以“未经检查或不安全的操作”警告运行。

class Foo<T> {
  T[] items = (T[]) new Object[10];

  public static void main(String[] args) {
    Foo<Integer> foo = new Foo<Integer>();
  }
}

虽然这两个给我运行时错误

class Foo<T> {
  class FooItem { T item; }

  FooItem[] items = (FooItem[]) new Object[10];

  public static void main(String[] args) {
    Foo<Integer> foo = new Foo<Integer>();
  }
}
class Foo<T> {
  static class FooItem<E> { E item; }

  FooItem<T>[] items = (FooItem<T>[]) new Object[10];

  public static void main(String[] args) {
    Foo<Integer> foo = new Foo<Integer>();
  }
}

我遇到的错误如下:

线程“主”中的异常java.lang.ClassCastException:类[Ljava.lang.Object; 不能转换为类[LFoo $ FooItem; ([[Ljava.lang.Object;位于装载程序'bootstrap'的模块java.base中; [LFoo $ FooItem;位于装载程序com.sun.tools.javac.launcher.Main $ MemoryClassLoader的未命名模块中

为什么是这样?

ernest_k

您的Foo课程的所有版本都有相同的问题。Type safety: Unchecked cast from Object[] to X您将忽略警告仅显示其在执行过程中不同阶段的后果。

这是打破第一个版本的方法:

class Foo<T> {
    T[] items = (T[]) new Object[10];

    public static void main(String[] args) {
        Foo<Integer> foo = new Foo<Integer>();

        Integer i = foo.items[1] * 2;
    }
}

它崩溃与...同样的问题:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
    at stackoverflow.Foo.main(Main.java:17)

为什么?因为(T[]) new Object[10];在编译时执行,即编译器不知道如何验证之间的关系T[]Object[]

正如你可以不投new Object()Integer,你可以不投new Object[10]Integer[]只是该类强制转换异常仅在运行实际强制转换时显示。对于第一个代码段,它不会在声明语句上运行T[] items = (T[]) new Object[10];(因此出现警告),但是将whenitems用作type参数的含义T

您的其他版本只是因为将其转换为具体类型(例如)(FooItem[]) new Object[10],导致声明语句本身崩溃,所以较早显示此问题
为什么编译器允许这种强制转换?因为类型关系是有效的,所以给定这样的代码

Object[] items = new Integer[10];
Integer[] i = (Integer[])items;
Integer val = i[0];

有效且受支持。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

什么是泛型类

来自分类Dev

为什么我不能通过约束将派生泛型类型转换为基础非泛型类型?

来自分类Dev

为什么允许向上转换数组,而不允许泛型?

来自分类Dev

为什么我不能将一个泛型类型的实例转换为另一个实例?

来自分类Dev

从泛型类返回数组

来自分类Dev

Java泛型:数组转换

来自分类Dev

实现泛型的自定义类的数组不允许自定义类具有子类的泛型

来自分类Dev

转换为泛型

来自分类Dev

为什么可以强制转换泛型类?

来自分类Dev

如何快速定义泛型类的数组

来自分类Dev

为什么不能将`this`转换为泛型?

来自分类Dev

泛型类和子类的数组

来自分类Dev

为什么不能将项目强制转换为泛型类型-泛型类型是接口,并且在检查项目是否实现了所述接口之后?

来自分类Dev

什么是泛型类

来自分类Dev

转换为基础泛型类

来自分类Dev

为什么我不能(通过约束)将派生泛型类型转换为基础非泛型类型?

来自分类Dev

带泛型的数组

来自分类Dev

实例化泛型类的JAVA数组

来自分类Dev

从泛型类转换为类型

来自分类Dev

从泛型转换为泛型

来自分类Dev

在泛型类中传递int数组

来自分类Dev

泛型类的类型化数组

来自分类Dev

泛型数组转换

来自分类Dev

为什么我不能将类型传递给泛型方法

来自分类Dev

Kotlin转换为泛型类

来自分类Dev

将泛型类型转换为子类

来自分类Dev

泛型类中数组属性的实例?

来自分类Dev

不能将泛型数组直接分配给局部变量

来自分类Dev

泛型类的 Autowire 子类