问题
This is a following question coming from Two methods for creating generic arrays.
With given two methods,
@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));
}
Both methods work fine for Object type.
final Integer[] objectArray1 = array1(Integer.class, 0);
final Integer[] objectArray2 = array2(Integer[].class, 0);
When it comes to primitives, both invocation don't compile.
// 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
How can I do with primitive types?
回答1:
Try this instead
static <A> A array3(final Class<A> arrayType, final int size)
{ impl omitted... }
final int[] primitiveArray3 = array3(int[].class, 0);
回答2:
Primitives are incompatible with generics; for example, you can't create a List<int>
, and the type of int.class
is Class<Integer>
rather than Class<int>
. So what you describe is not possible.
回答3:
This is the normal way:
int[] foo = (int[])Array.newInstance(int.class, 5);
As ruakh mentioned, you cannot make something work generically for primitive types, so you're gonna have to cast the result somehow.
回答4:
You cannot use primitives with generics. On the other hand, you can use Integer[]
in place of int[]
and rely on auto(un)boxing to convert between int
and Integer
when necessary.
回答5:
You cannot use primitives with generics, only Objects
; however, you can use their wrappers: Integer
, Character
, etc.
回答6:
This works and creates int[]:
final Object instance = Array.newInstance(Integer.TYPE, 0);
来源:https://stackoverflow.com/questions/17226379/how-to-create-generic-primitive-arrays