How to create common primitive arrays?

This is the next question coming from Two methods for creating shared arrays .

When using 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 an object type.

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

When it comes to primitives, both calls are not compiled.

 // 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
source share
6 answers

Try this instead

 static <A> A array3(final Class<A> arrayType, final int size) { impl omitted... } final int[] primitiveArray3 = array3(int[].class, 0); 
+3
source

Primitives are incompatible with generics; for example, you cannot create a List<int> , and an int.class type is a Class<Integer> , not a Class<int> . So what you have described is impossible.

+3
source

You cannot use primitives with generics. On the other hand, you can use Integer[] instead of int[] and rely on an automatic (un) box to convert between int and Integer when necessary.

+1
source

You cannot use primitives with generics, only Objects ; however, you can use their wrappers: Integer , Character , etc.

+1
source

This works and creates an int []:

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

This is the usual way:

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

As ruach mentioned, you cannot make something work mainly for primitive types, so you need to somehow produce the result.

+1
source

Source: https://habr.com/ru/post/1487196/


All Articles