Try this instead
static <A> A array3(final Class<A> arrayType, final int size)
{ impl omitted... }
final int[] primitiveArray3 = array3(int[].class, 0);
Question
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?
Solution
Try this instead
static <A> A array3(final Class<A> arrayType, final int size)
{ impl omitted... }
final int[] primitiveArray3 = array3(int[].class, 0);
OTHER TIPS
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.
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.
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.
You cannot use primitives with generics, only Objects
; however, you can use their wrappers: Integer
, Character
, etc.
This works and creates int[]:
final Object instance = Array.newInstance(Integer.TYPE, 0);