gpt4 book ai didi

java - 无法将 ClassCastException 对象强制转换为

转载 作者:行者123 更新时间:2023-11-29 07:47:39 26 4
gpt4 key购买 nike

我不明白为什么我在下面的代码中得到 ClassCastException:

for(int i = 0; i < k.t.length; i++)

所以问题是,在方法 addElement 中,我用类型为 T 的对象替换了数组元素。在我看来,数组中应该是类型为 T 的对象。编译器不会对此提出异议。但是在运行时 JVM 无法转换,尽管数组实际上是类型为 T 的对象(在字符串以下的情况下),为什么 JVM 不能使用多态性?

但是当我将 T[] t; 更改为 Object[] t;

并在构造函数中删除强制转换,它可以正确运行,没有任何错误,为什么?

public class MyCollection<T> {

T[] t;

MyCollection( int size){
t = (T[]) new Object[size];
}

boolean addElement(T e, int i){
if(i < t.length){
t[i] = e;
return true;
}
return false;
}

public static void main(String[] ss){

MyCollection<String> k = new MyCollection<String>(3);

k.addElement("a",0);
k.addElement("b",1);
k.addElement("c",2);

for(int i = 0; i < k.t.length; i++)
System.out.println(k.t[i]);

//for(String s : (String[])k.t)
// System.out.println(s);
}
}

最佳答案

问题是您将 Object[] 转换为 T[],然后您公开了底层数组。这完全有效的唯一原因是 T 的类型删除是 Object。但由于在我们的例子中 T 被解释为 String,当我们从外部访问数组时,我们试图将其转换为 String[],这是不正确的。为了避免这个问题,您应该将数组设为私有(private)并提供访问器方法来检索元素。通过这样做,您只需将单个元素转换为正确的类型,而无需对底层数组做出假设。

public class MyCollection<T> {

private T[] t;

MyCollection( int size){
t = (T[]) new Object[size];
}

boolean addElement(T e, int i){
if(i < t.length){
t[i] = e;
return true;
}
return false;

}

T getElement(int index) {
return t[index];
}

int getLength() {
return t.length;
}

public static void main(String[] ss){

MyCollection<String> k = new MyCollection<String>(3);

k.addElement("a",0);
k.addElement("b",1);
k.addElement("c",2);

for(int i = 0; i < k.getLength(); i++)
System.out.println(k.getElement(i));

//for(String s : (String[])k.t)
// System.out.println(s);
}
}

请注意,Java 的 Collection 接口(interface)演示了相同的行为。 Collection.toArray()无论 E 的类型如何,都返回 Object[]。唯一可用的解决方法是 Collection.toArray(T[]) ,您必须在其中传递具有固定类型的数组,然后可以填充或复制该数组。

关于java - 无法将 ClassCastException 对象强制转换为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24104207/

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