Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法将ClassCastException对象强制转换为_Java_Generics_Classcastexception - Fatal编程技术网

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