gpt4 book ai didi

java - 两种创建具有相同结果的泛型数组的方法,但只有一种有效

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:22:58 26 4
gpt4 key购买 nike

我最近尝试创建一个泛型数组,但发现这是不允许的:
Cannot create generic array of OptionSet<T>

我决定做一个测试类,发现有一个不同的方法,结果完全相同:

public class Test {

@SuppressWarnings("unchecked")
public static final void main(String[] args) {
A<String> a = null;
A<String> b = null;

A<?>[] array1 = array(a, b); // fine, only a warning
A<?>[] array2 = new A<String>[] {a, b}; // Error: Cannot create a generic array of Test.A<String>
}

@SuppressWarnings("unchecked")
private static final <T> A<T>[] array(A<T>... a) {
return a; // fine, only a warning
}

private static final class A<T> {}

}

这是为什么呢?两种方法的结果完全相同,但出于某种原因,一种会抛出错误,而另一种工作正常,但会发出警告。

最佳答案

这是因为在通过返回类型 private static final <T> A<T>[] array(A<T>... a) 调用方法时发生了转换这不是 A<?>[] array2 = new A<String>[] {a, b}; 的情况您直接在其中创建实例。

为了让它工作你需要像下面这样显式地转换:

A<?>[] array2 = (A<String>[])(new A<?>[] { a, b });

发生的事情是元素是A<String>但不是数组本身;它仍然是通用的A<?>直到你明确地转换它。

关于java - 两种创建具有相同结果的泛型数组的方法,但只有一种有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50784655/

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