将用户类对象添加到genericlist< t>类中在java中出现错误(classcastexception)

tzcvj98z  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(348)

这个问题在这里已经有答案了

java泛型类强制转换异常(3个答案)
上个月关门了。
我目前正在学习java,我似乎不明白为什么会有classcastexception。我在这里看了很多例子,但似乎仍然不能完全理解手头的问题。这是我的密码:
通用列表.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);
    }
}

用户.java

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;
    }
}

主.java

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);
    }
}

我试着调试代码,上面的代码中指出了有问题的行。我不明白为什么它会抛出错误呢?我错过了什么?
其思想是将新创建的user对象存储在generic user list items数组中,然后使用getcompleteeserlist方法打印完整的用户列表。
我已经花了两个多小时在这个问题上,但没有结果。我确信这是我在某个地方丢失的最基本最愚蠢的东西,但不知道是什么。

aiqt4smr

aiqt4smr1#

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

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

ohtdti5x2#

Object[] 不能强制转换为 T[]T 删除为 User 由于 T extends User 束缚。存储 Object[] 然后将单个项目投射到 T 需要时:

import java.util.Arrays;

public class GenericList<T extends User> {
    // this is Object[] now
    private Object[] items = new Object[10];
    private int count;

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

    public T get(int index) {
        // need a cast to T here
        return (T) items[index];
    }

    public String getCompleteUserList() {
        return Arrays.deepToString(items);
    }
}

相关问题