Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.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
将用户类对象添加到GenericList<;T>;Java中的类给定错误(ClassCastException)_Java_Classcastexception - Fatal编程技术网

将用户类对象添加到GenericList<;T>;Java中的类给定错误(ClassCastException)

将用户类对象添加到GenericList<;T>;Java中的类给定错误(ClassCastException),java,classcastexception,Java,Classcastexception,我目前正在学习Java,我似乎不明白为什么会有ClassCastException。我在这里看了很多例子,但似乎仍然无法理解手头的问题。这是我的密码: genericslist.java import java.util.Arrays; public class GenericList<T extends User> { private T[] items = (T[]) new Object[10]; // error here on debugging priv

我目前正在学习Java,我似乎不明白为什么会有ClassCastException。我在这里看了很多例子,但似乎仍然无法理解手头的问题。这是我的密码:

genericslist.java

import java.util.Arrays;

public class GenericList<T extends User> {
    private T[] items = (T[]) new Object[10]; // error here on debugging
    private int count;

    public void add(T item) {
        items[count++] = item;
    }

    public T get(int index) {
        return items[index];
    }

    public String getCompleteUserList() {
        return Arrays.deepToString(items);
    }
}
public class User implements Comparable<User> {
    private final String name;
    private final int age;
    private GenericList<User> userList = new GenericList<>(); // error here on debugging
    
    public User(String name, int age) {
        this.name = name;
        this.age = age;        
        userList.add(this);
    }

    @Override
    public int compareTo(User otherUser) {
        return this.age - otherUser.age;
    }

    @Override
    public String toString() {
        return "Name = " + this.name + "; Age = " + this.age;
    }
}
public class Main {
    public static void main(String[] args) {
        var user1 = new User("User 1", 25); // error on this line during debugging
        var user2 = new User("User 2", 24);
    }
}
我试着调试代码,上面的代码中指出了有问题的行。我不明白为什么它会抛出错误?我错过了什么

其思想是将新创建的用户对象存储在通用用户列表项数组中,然后使用getCompleteServList方法打印完整的用户列表


我花了两个多小时在这上面,但都没有用。我确信这是我在某个地方遗漏的最基本、最愚蠢的东西,但我不知道是什么。

这里的类强制转换异常是因为您使用“扩展”用户的对象模板化了泛型列表。。。在第一个示例中,您尝试将不是用户子类的对象分配给它

应该是

private T[] items = (T[]) new User[10];

Object[]
无法强制转换为
T[]
,因为
T
由于绑定了
T extensed User
而要转换为
User
。存储一个
对象[]
,然后在需要时将单个项目强制转换为
T

导入java.util.array;
公共类泛型列表{
//这是对象[]
私有对象[]项=新对象[10];
私人整数计数;
公共作废新增(T项){
项目[计数++]=项目;
}
公共T获取(整数索引){
//需要一个演员在这里表演
返回(T)项[索引];
}
公共字符串getCompleteUserList(){
返回数组。deepToString(项目);
}
}

Object通常可以强制转换为T,只要T被擦除为Object。这不仅仅是因为t被写为受用户约束,因此,它删除了它。这是正确的解决方案,但解释不正确@G的答案有正确的解释。当包含对象的items数组被强制转换为t(这扩展了User?)@AG时,get方法现在不会导致类强制转换吗?是的,它会,但是强制转换不会出错,因为数组中的所有项都是t类型的。谢谢。所以基本上,如果我理解正确,整个问题都与T成为用户对象有关,因为我用User扩展了T。这使得无法将强制转换对象(父对象)键入用户[](子对象)。我说得对吗?这是正确的解释,但不是正确的解决方案。另一个答案(由@Aplet123给出)是正确的解决方案(我们可以了解原因,但也许它足以说明java自己的ArrayList与@Aplet123的答案类似)。