这是来自Two methods for creating generic arrays的以下问题。
给定两种方法,
@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));
}
两种方法都适用于对象类型。
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
如何处理原始类型?
答案 0 :(得分:4)
原语与泛型不相容;例如,您无法创建List<int>
,int.class
的类型为Class<Integer>
而不是Class<int>
。所以你所描述的是不可能的。
答案 1 :(得分:4)
试试这个
static <A> A array3(final Class<A> arrayType, final int size)
{ impl omitted... }
final int[] primitiveArray3 = array3(int[].class, 0);
答案 2 :(得分:1)
这是正常的方式:
int[] foo = (int[])Array.newInstance(int.class, 5);
正如鲁赫所提到的,你不能为原始类型做一些普遍的工作,所以你必须以某种方式投射结果。
答案 3 :(得分:0)
您不能将基元与泛型一起使用。另一方面,您可以使用Integer[]
代替int[]
并依赖自动(联合)装箱,以便在必要时在int
和Integer
之间进行转换。
答案 4 :(得分:0)
您不能将基元用于泛型,只能使用Objects
;但是,您可以使用他们的包装:Integer
,Character
等
答案 5 :(得分:0)
这可以工作并创建int []:
final Object instance = Array.newInstance(Integer.TYPE, 0);