gpt4 book ai didi

java - Java 删除如何影响通用数组?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:00:23 25 4
gpt4 key购买 nike

这段时间我在研究泛型,今天为我找到了这个奥秘。

让我们考虑以下虚拟类:

    public class Main{

public static void main(String[] args) {
Container<Integer> c = new Container<Integer>();

c.getArray(); //No Exception
//c.getArray().getClass(); //Exception
//int a = c.getArray().length; //Exception

}

}


class Container<T> {

T[] array;

@SuppressWarnings("unchecked")
Container() {
array = (T[])new Object[1];
}

void put(T item) {
array[0] = item;
}

T get() { return array[0]; }

T[] getArray() { return array; }
}

因为删除,在运行时,getArray() 方法的 T[] 返回类型变成了 Object[],这对我来说是完全合理的。

如果我们按原样访问该方法 (c.getArray()),则不会抛出异常,但如果我们尝试在返回的数组上调用某些方法,例如 c.Array().getClass(),或者如果我们尝试访问一个字段,例如 c.getArray().length,然后抛出以下异常:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;

为什么抛出这个异常?为什么简单的 c.getArray() 调用也不会抛出它?如果我们只是调用 getClass() 或访问长度,为什么它会尝试转换为 Integer[]?getClass() 和 length 是否也不适用于 Object[]?

提前感谢您提供的许多(我希望)和解释性(我也希望如此)的答案。

最佳答案

异常的原因是编译器需要一个 Integer[] 但收到一个 Object[]。它在 getArray 的调用位置添加了运行时转换。这些强制转换在您的构造函数中发现了说谎的、虚拟的、无效的强制转换。

为了使其正确,需要 T 的实际类才能创建实例。

@SuppressWarnings("unchecked")
Container(Class<T> type) {
array = (T[]) Array.newInstance(type, 10);
}


Container<Integer> c = new Container<Integer>(Integer.class);

c.getArray();
Class<?> t = c.getArray().getClass();
System.out.println(t.getName());
int a = c.getArray().length;

这里仍然是对 T[] 的“不安全”转换,但这是不可避免的,因为 Array.newInstance 是 n 维数组的低级方法,例如:

(double[][][][][][]) Array.newInstance(double.class, 3, 3, 3, 3, 3, 6);

关于java - Java 删除如何影响通用数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38267215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com