Java Casting摘要在两个具体类之间

时间:2018-03-14 15:52:10

标签: java casting type-inference

我正在实现一个工厂模式,在一个抽象中创建两个具体类,其中工厂方法被重载(见下文):

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语句按预期输出而没有错误;但是,当尝试在每次循环迭代之间使用这些唯一方法调用时,我得到了转换错误。您可以告诉我如何解决这个问题以及我做错了什么,无论是推理方法还是工厂模式?

2 个答案:

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

参考:parent-child type conversion