创建通用数组的两种方法

4

我学过以下两种创建通用数组的方法。

第一种是

@SuppressWarnings("unchecked")
static <T> T[] array1(final Class<T> elementType, final int size) {

    return (T[]) Array.newInstance(elementType, size);
}

另外一个是:
static <T> T[] array2(final Class<T[]> arrayType, final int size) {

    return arrayType.cast(Array.newInstance(arrayType.getComponentType(), size));
}

哪个更好?它们内部是相同的吗?有任何错误的情况吗?


我认为第一种方法更好。 - Arun P Johny
有人可以解释一下第二种方法吗?它在做什么? - Abbas Gadhia
以下问题:https://dev59.com/C3PYa4cB1Zd3GeqPkZK_ - Jin Kwon
3个回答

6
在幕后,这两种方法实际上做的是相同的事情,只不过在选项1中,您传递了T的类对象,在选项2中,您传递了T[]的类对象。
我更喜欢选项1,因为它更短,更容易阅读。不过,它与添加了一个强制转换的Array.newInstance相同,所以我不确定您的方法是否增加了很多价值。 :-)

2
请注意,第一种方法不是类型安全的。例如,以下代码会导致ClassCastException异常:
array1(int.class, 5);

已经检查并确认。这两种方法甚至对原始类型都无法编译。 - Jin Kwon
2
@JinKwon:不,第一个编译并抛出异常。第二个不编译,并且是类型安全的。 - newacct
如果被分配给int[]变量,则无法编译 - ZhongYu

0

创建通用数组的另一种(更好的)方式

@SafeVarargs
static <E> E[] newArray(int length, E... array)
{
    return Arrays.copyOf(array, length);
}


Integer[] ints = newArray(10);

String[] strings = newArray(10); 

请注意,如果调用者本身处于泛型范围内并且未将“T”解析为具体类型,则此操作将失败。 - Paul Bellora
仅因擦除而发生这种问题:) 而且array1/array2()也存在相同的问题。 - ZhongYu
它不会出现问题,因为它们使用“Class”类型令牌和反射来解决擦除问题。 - Paul Bellora

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接