gpt4 book ai didi

java - 为什么我不能在 Java 中创建类型参数的数组?

转载 作者:太空狗 更新时间:2023-10-29 22:41:05 32 4
gpt4 key购买 nike

好吧,我已经阅读了很多关于这个问题的答案,但我有一个更具体的答案。以下面的代码片段为例。

public class GenericArray<E>{
E[] s= new E[5];
}

类型删除后变为

public class GenericArray{
Object[] s= new Object[5];
}

这段代码似乎运行良好。为什么会导致编译时错误?

此外,我从其他答案中了解到,以下代码可以很好地实现相同的目的。

public class GenericArray<E>{
E[] s= (E[])new Object[5];
}

我看过一些评论说上面这段代码不安全,但为什么不安全呢?谁能给我提供一个具体的例子,上面的代码段会导致错误?

另外,下面的代码也是错误的。但为什么?删除后似乎也能正常工作。

public class GenericArray<E>{
E s= new E();
}

最佳答案

Array declarations are required to have a reifiable type , 和 generics are not reifiable.

来自文档:您可以放置​​在数组上的唯一类型是可具体化的类型,即:

  • It refers to a non-generic class or interface type declaration.

  • It is a parameterized type in which all type arguments are unbounded wildcards (§4.5.1).

  • It is a raw type (§4.8).

  • It is a primitive type (§4.2).

  • It is an array type (§10.1) whose element type is reifiable.

  • It is a nested type where, for each type T separated by a ".", T itself is reifiable.

这意味着“通用”数组的唯一合法声明类似于List<?>[] elements = new ArrayList[10];。 .但这绝对不是一个通用数组,它是一个 List 的数组。未知类型。

Java 提示您执行转换为 E[] 的主要原因是因为它是 unchecked cast .也就是说,您将从一个已检查的类型明确地转到一个未检查的类型;在本例中,检查泛型类型 E到未检查的类型 Object .但是,这是创建通用数组的唯一方法,如果您必须使用数组,通常认为这是安全的。

一般来说,避免这种情况的建议是在可能的地方和时间使用通用集合。

关于java - 为什么我不能在 Java 中创建类型参数的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30074900/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com