我正在实现一个工厂模式,在一个抽象中创建两个具体类,其中工厂方法被重载(见下文):
public abstract class User {
...
public static User make(int id, String name) {
return new Admin(id, name);
}
public static User make(int id, int student_id, String name) {
return new Student(id, student_id, name);
}
}
这是工厂电话:
ArrayList<User> users = new ArrayList<>(
Arrays.asList(
User.make(1000, "Andy"), // makes new Admin
User.make(1001, 101001, "Bob") // makes new Student
)
);
这是Admin类:
public class Admin extends User {
...
// constructor
protected Admin(int id, String name) {
super(id, name);
}
...
}
这是学生班:
public class Student extends User {
...
// constructor
protected Student(int id, int student_id, String name) {
super(id, name);
this.student_id = student_id;
}
...
}
这些混凝土中的每一个都放在User ArrayList中。我有一个函数(下面)循环遍历列表并执行运行时推理来调用每个具体的特定方法;但我在IDE中收到ClassCastException错误,说明管理员无法转发给学生。
完整的异常消息是: 线程中的异常&#34; main&#34; java.lang.ClassCastException:presentation_layer.Admin无法强制转换为presentation_layer.Student
public class App {
...
public static void main(String[] args) {
ArrayList<User> users = new ArrayList<>(
Arrays.asList(
User.make(1000, "Andy"), // makes new Admin
User.make(1001, 101001, "Bob") // makes new Student
)
);
users.forEach((u) -> {
if (u instanceof Admin)) {
System.out.println("hello admin");
((Admin)u).anAdminFunc();
} else if (u instanceof Student)) {
System.out.println("hello student");
((Student)u).aStudentFunc();
}
});
}
...
}
当我注释掉具体方法调用时,相应的print语句按预期输出而没有错误;但是,当尝试在每次循环迭代之间使用这些唯一方法调用时,我得到了转换错误。您可以告诉我如何解决这个问题以及我做错了什么,无论是推理方法还是工厂模式?
答案 0 :(得分:1)
使用instanceof代替。 另外,如果你发现自己做了很多演员
,你可能想重新考虑继承的使用答案 1 :(得分:0)
试试这个:
public static User make(int id, String name) {
User user = new Admin(id,name);
return user;
}
public static User make(int id, int student_id, String name) {
User user = new Student(id, student_id, name);
return user;
}