I'm trying to concatenate/merge two Integer[] array and store it in an other Integer[]. But I'm getting bellow error at run time.
Exception in thread "main" java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [Ljava.lang.Integer; ([Ljava.lang.Object; and [Ljava.lang.Integer; are in module java.base of loader 'bootstrap') at AllInOnePack.MainClass.AllInOne.main(AllInOne.java:61)
My code is like this.
Main class.java
static Integer[] hardCodeValus = {1,2,3,4};
static Integer[] userValue = {1,2,3,4};
concatArray = new Integer[hardCodeValus.length+userValue.length];
concatArray = (Integer[]) StreamsFunc.concatenate(hardCodeValus, userValue);
StreamsFunc.java
public static <T> Object[] concatenate(T[] hardCodeValus, T[] userValue)
{
return Stream.concat(Arrays.stream(hardCodeValus), Arrays.stream(userValue)).toArray();
}
During run time I'm getting the error. Why this is not found in compile time then?
Why this is not found in compile time then?
Because you casted the result of concatenate
to Integer[]
. Had you removed the cast, there will be a compiler error saying that Object[]
(the return type of concatenate
), cannot be converted to Integer[]
(the type of concatArray
).
Note that the parameterless Stream.toArray()
returns an instance of Object[]
, not an array of whatever type of element the stream contains. It can't possibly do the latter because of type erasure.
Returns:
an array, whose runtime component type is
Object
, containing the elements of this stream
Also note that it is unnecessary to initialise concatArray
to new Integer[...]
, if concatenate
is going to return a new array anyway.
To fix concatenate
, one way would be to call the overload of toArray
with an IntFunction
:
public static <T> T[] concatenate(T[] hardCodeValus, T[] userValue, IntFunction<T[]> arrayCreator)
{
return Stream.concat(Arrays.stream(hardCodeValus), Arrays.stream(userValue))
.toArray(arrayCreator);
}
Usage:
var concatArray = concatenate(hardCodeValus, userValue, Integer[]::new);