Java 无法将ClassCastException对象强制转换为
我不明白为什么在下面的代码行中出现Java 无法将ClassCastException对象强制转换为,java,generics,classcastexception,Java,Generics,Classcastexception,我不明白为什么在下面的代码行中出现ClassCastException: for(int i = 0; i < k.t.length; i++) 再次检查问题所在的行。我认为将引发异常,因为: for(String s : (String[])k.t) 您试图在此处强制转换为字符串[],而数组定义为Object[]: t = (T[]) new Object[size]; 再次检查问题所在的行。我认为将引发异常,因为: for(String s : (String[]
ClassCastException
:
for(int i = 0; i < k.t.length; i++)
再次检查问题所在的行。我认为将引发异常,因为:
for(String s : (String[])k.t)
您试图在此处强制转换为字符串[],而数组定义为Object[]:
t = (T[]) new Object[size];
再次检查问题所在的行。我认为将引发异常,因为:
for(String s : (String[])k.t)
您试图在此处强制转换为字符串[],而数组定义为Object[]:
t = (T[]) new Object[size];
您可以使用反射创建一个新的数组实例,以避免
ClassCastException
示例:
import java.lang.reflect.Array;
public class MyCollection<T> {
T[] t;
MyCollection(Class<T> clazz, int size) {
t = (T[]) Array.newInstance(clazz, size);
}
boolean addElement(T e, int i) {
if (i < t.length - 1) {
t[i] = e;
return true;
}
return false;
}
public static void main(String[] ss) {
MyCollection<String> k = new MyCollection<String>(String.class, 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[0]);
}
}
import java.lang.reflect.Array;
公共类MyCollection{
T[]T;
MyCollection(类分类,整数大小){
t=(t[])Array.newInstance(clazz,size);
}
布尔加法(te,int i){
如果(i
您可以使用反射创建一个新的数组实例,以避免ClassCastException
示例:
import java.lang.reflect.Array;
public class MyCollection<T> {
T[] t;
MyCollection(Class<T> clazz, int size) {
t = (T[]) Array.newInstance(clazz, size);
}
boolean addElement(T e, int i) {
if (i < t.length - 1) {
t[i] = e;
return true;
}
return false;
}
public static void main(String[] ss) {
MyCollection<String> k = new MyCollection<String>(String.class, 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[0]);
}
}
import java.lang.reflect.Array;
公共类MyCollection{
T[]T;
MyCollection(类分类,整数大小){
t=(t[])Array.newInstance(clazz,size);
}
布尔加法(te,int i){
如果(i
问题是您正在将对象[]
强制转换为T[]
,然后您正在公开底层数组。这完全起作用的唯一原因是T
的类型擦除是Object
。但是由于在我们的例子中,T
被解释为String
,当我们从外部访问数组时,我们试图将其强制转换为String[]
,这是不正确的。为了避免这个问题,您应该使数组私有,并提供访问器方法来检索元素。通过这样做,您只需将单个元素强制转换为正确的类型,而无需对底层数组进行假设
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);
}
}
公共类MyCollection{
私人T[]T;
MyCollection(整数大小){
t=(t[])新对象[大小];
}
布尔加法元(te,int i){
if(i
请注意,Java的
集合
接口演示了相同的行为。返回对象[]
,而不考虑E的类型。唯一可用的解决方法是,您必须传递一个固定类型的数组,然后可以填充或复制该数组。问题是您正在将对象[]
强制转换为T[]
,然后您正在公开基础数组。这完全起作用的唯一原因是T
的类型擦除是Object
。但是由于在我们的例子中,T
被解释为String
,当我们从外部访问数组时,我们试图将其强制转换为String[]
,这是不正确的。为了避免这个问题,您应该使数组私有,并提供访问器方法来检索元素。通过这样做,您只需将单个元素强制转换为正确的类型,而无需对底层数组进行假设
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);
}
}
公共类MyCollection{
私人T[]T;
MyCollection(整数大小){
t=(t[])新对象[大小];
}
布尔加法元(te,int i){
if(i
请注意,Java的集合
接口演示了相同的行为。返回对象[]
,而不考虑E的类型。唯一可用的解决方法是,强制传递一个固定类型的数组,然后可以填充或复制该数组。可能需要k.t[0]。toString()
@algui91:no,println已经这样做了。@algui91问题不在System.out.println(k.t[0]);但是在for(int i=0;ik.t[0]。toString()
@algui91:不,println已经这样做了。@algui91问题不在System.out.println(k.t[0]);但是对于(inti=0;i中