[英]How do I cast from an Object[] to another array type?
我有一个通用的方法(我不太确定这是否是正确的术语。)将对象添加到数组中的方法。
@SuppressWarnings("unchecked")
public static <T>T[] appendArray(T[] a, T b)
{
T[] temp = (T[])new Object[a.length + 1];
System.arraycopy(a, 0, temp, 0, a.length);
temp[a.length] = b;
return temp;
}
在Eclipse中,这段代码不会给我任何错误,也不会发出警告(除了被抑制的“未选中”警告之外),而且在我看来,这应该可以工作。 。
Integer[] a=new Integer[]{1,2,3};
Integer b=4;
a = appendArray(a, b);
在这种情况下,它在我发布的ClassCastException
代码的第3行的第3行上给了我ClassCastException
。 该错误显示为[Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
[Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
我不能看,不能明白为什么会这样。我的意思是,我使用的是仿制药,那么,为什么它会有一个Object[]
比我投键入另一个T
实例化过程中? 如果它是第4行(当然是在代码的第一位)中的那个,为什么不将异常抛出到那里而不是在代码的第二位的第3行呢?
代替使用System.arraycopy
,使用Arrays.copyOf
,该方法将数组实例化为通用类型。
public static <T> T[] appendArray(T[] a, T b) {
T[] temp = (T[]) Arrays.copyOf(a, a.length + 1, a.getClass());
temp[a.length] = b;
return temp;
}
您不能将数组转换为其他数组。
数组确实具有值类型。 这就是[Ljava.lang.Integer;
说:整数数组。 那是与对象数组不兼容的类型。
您是否注意到所有Java集合类都使用Object[]
? 原因是这是他们确定可以存储数据的数组类型。
还要注意toArray
方法的外观。 它需要知道您要取出的数组的类型。 它不能从泛型中正确地猜测出类型。 本质上,您需要一个原型对象,然后需要创建适当类型的数组。
其他答案涵盖了如何重写代码以使其正常工作,但是问题的后半部分仍然存在,因此:
您似乎从根本上误解了演员表是什么。 它不会改变任何东西的真实类型。 它告诉编译器“嘿,我知道这个X类型的引用实际上是Y,请相信我。”
Integer i = (Integer) new Object();
那不会导致Object
变成Integer
! 当JVM发现您对编译器撒谎时,它将在运行时引发错误。
该错误发生的时间比您在示例中预期的要晚,原因是“ T”是Java中仅编译时的概念。 为了运行时,您可以使用Object
替换每个“ T”。
作为类型擦除过程的一部分,代码将检查在您的方法返回并尝试进行赋值的地方,以检查您所声明的方法是否返回Integer[]
。
泛型和数组不要混用!
有一种解决方法。 您可以使用特殊的Array.newInstance()
方法创建具有特定组件类型的数组对象:
public static <T> T[] appendArray(T[] a, T b) {
T[] temp = (T[]) Array.newInstance(b.getClass(), a.length + 1);
System.arraycopy(a, 0, temp, 0, a.length);
temp[a.length] = b;
return temp;
}
调用时此代码不会引发任何错误:
public static void main(String[] args) {
Integer[] a = new Integer[] { 1, 2, 3 };
Integer b = 4;
a = appendArray(a, b);
System.out.println(Arrays.toString(a));
}
输出:
[1, 2, 3, 4]
您可以创建一个泛型类型为T
的ArrayList
并将其作为数组获取。
@SuppressWarnings("unchecked")
public static <T>T[] appendArray(T[] a, T b)
{
T[] temp = new ArrayList<T>(Arrays.asList(a)).toArray(a);
System.arraycopy(a, 0, temp, 0, a.length);
temp[a.length-1] = b;
return temp;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.