如何创建通用的基本数据类型数组?

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));
}

两种方法在处理Object类型时都能很好地工作。

final Integer[] objectArray1 = array1(Integer.class, 0);
final Integer[] objectArray2 = array2(Integer[].class, 0);

在原始类型方面,两个调用都无法编译。

// array1
final int[] primitiveArray1 = array1(int.class, 0);

GenericArray.java:12: error: incompatible types
        final int[] primitiveArray1 = array1(int.class, 0);
                                            ^
  required: int[]
  found:    Integer[]
1 error

// array2
final int[] primitiveArray2 = array2(int[].class, 0);

GenericArray.java:13: error: method array2 in class GenericArray cannot be applied to given types;
        final int[] primitiveArray2 = array2(int[].class, 0);
                                      ^
  required: Class<T[]>,int
  found: Class<int[]>,int
  reason: inferred type does not conform to declared bound(s)
    inferred: int
    bound(s): Object
  where T is a type-variable:
    T extends Object declared in method <T>array2(Class<T[]>,int)
1 error

我该如何处理原始类型?


可能是Java如何:泛型数组创建的重复问题。 - Code-Apprentice
你使用的是哪个版本的Java? - Raceimaztion
1
@Code-Guru:我没看到。他们似乎在问非常不同的问题。 - ruakh
@ruakh 我应该更仔细地看;-( - Code-Apprentice
6个回答

4
尝试使用这个代替。
static <A> A array3(final Class<A> arrayType, final int size) 
{    impl omitted... }

final int[] primitiveArray3 = array3(int[].class, 0);

有人能编辑这篇文章,提供“impl omitted”吗?我不知道应该放什么。 - Serge Rogatch

4
原始类型与泛型不兼容;例如,您无法创建一个List<int>,而int.class的类型是Class<Integer>而不是Class<int>。因此,您所描述的情况是不可能的。

1

这是正常的方式:

int[] foo = (int[])Array.newInstance(int.class, 5);

正如ruakh所述,你无法将某些东西普遍适用于原始类型,因此你必须以某种方式进行类型转换。

0

这个有效并创建了 int[]:

final Object instance = Array.newInstance(Integer.TYPE, 0);

0

你不能在泛型中使用原始类型。另一方面,你可以使用 Integer[] 替代 int[],并依赖于自动装箱和拆箱来在必要时在 intInteger 之间进行转换。


0

你不能在泛型中使用原始类型,只能使用 Objects;但是,你可以使用它们的包装类:IntegerCharacter 等。


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