将用户 class 对象添加到 GenericList<T> class 在 Java 中给出错误(ClassCastException)
Adding User class object to GenericList<T> class giving error in Java (ClassCastException)
我目前正在学习 Java,我似乎无法弄清楚为什么会有 ClassCastException。我在这里查看了许多示例,但似乎仍然无法解决手头的问题。这是我的代码:
GenericList.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);
}
}
User.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;
}
}
Main.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);
}
}
我尝试调试代码,上面的代码中指出了有问题的行。我不明白为什么它会抛出错误?我错过了什么?
想法是将新创建的用户对象存储在通用用户列表项数组中,然后使用 getCompleteUserList 方法打印完整的用户列表。
我为此花费了2个多小时无果。我确信这是我在某处遗漏的最基本和最愚蠢的东西,但不知道是什么。
这里的 Class 转换异常是因为你有一个用“扩展”用户的对象模板化的通用列表......并且在第一个就像你尝试分配不是子[=的对象16=] 的用户。
应该是
private T[] items = (T[]) new User[10];
Object[]
无法转换为 T[]
,因为 T
是 erased 到 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);
}
}
我目前正在学习 Java,我似乎无法弄清楚为什么会有 ClassCastException。我在这里查看了许多示例,但似乎仍然无法解决手头的问题。这是我的代码:
GenericList.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);
}
}
User.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;
}
}
Main.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);
}
}
我尝试调试代码,上面的代码中指出了有问题的行。我不明白为什么它会抛出错误?我错过了什么?
想法是将新创建的用户对象存储在通用用户列表项数组中,然后使用 getCompleteUserList 方法打印完整的用户列表。
我为此花费了2个多小时无果。我确信这是我在某处遗漏的最基本和最愚蠢的东西,但不知道是什么。
这里的 Class 转换异常是因为你有一个用“扩展”用户的对象模板化的通用列表......并且在第一个就像你尝试分配不是子[=的对象16=] 的用户。
应该是
private T[] items = (T[]) new User[10];
Object[]
无法转换为 T[]
,因为 T
是 erased 到 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);
}
}