将用户类对象添加到GenericList<;T>;Java中的类给定错误(ClassCastException)
我目前正在学习Java,我似乎不明白为什么会有ClassCastException。我在这里看了很多例子,但似乎仍然无法理解手头的问题。这是我的密码: genericslist.java将用户类对象添加到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
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的答案类似)。