繁体   English   中英

如何从Object []转换为其他数组类型?

[英]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]

您可以创建一个泛型类型为TArrayList并将其作为数组获取。

@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM