在Java中的ArrayList中存储两种类型的对象

时间:2017-06-11 13:31:11

标签: java eclipse class arraylist abstract

我正在研究一个学校项目,我需要创建一个包含两种类型对象的“ArrayList”,“manager”和“ticket salesmen”,因为我创建了一个抽象类“user”,这两种类型扩展了它,I创建了一个ArrayList类型“user”并在其中存储了“manager”和“ticket salesmen”,但是如何访问这两种类型呢?我只能以“用户”的身份访问列表中的每个元素,并获取抽象类具有的属性,而不是“经理”或“票务推销员”。如何获取这两个对象的属性并且可以识别对象类型,因为在哪个类中它是一个实例?

6 个答案:

答案 0 :(得分:1)

您可以使用instanceof运算符来识别实际的用户类型

User obj = new Manager();
User obj2 = new SalesMan();
System.out.println(obj instanceof Manager); // true
System.out.println(obj instanceof SalesMan);// false

System.out.println(obj2 instanceof Manager); // false
System.out.println(obj2 instanceof SalesMan);// true

答案 1 :(得分:0)

您应首先检查子类的类型。这可以通过使用instanceOf运算符来完成。确定子类类型后,应将User强制转换为该特定子类。在转换后,您可以访问该特定子类的功能。

但请注意,应尽可能避免使用instanceOf。为避免使用instanceOf,您可以查看此question上接受的答案。

答案 2 :(得分:0)

遍历arrayList,使用instanceof检查类型,然后强制转换以使用方法和属性。尝试这样的事情。

for (User user : arrayList) {
    if (user instanceof Manager) {
        Manager manager = (Manager) user;
        //manager.method();
    } else if(list instanceof SalesMan){
        SalesMan salesMan = (SalesMan) user;
        //salesMan.method();
    }     
}

答案 3 :(得分:0)

另一种方法是使用getClass()来获取类的类型:

for (Object obj : userArrayList) {
    if (obj.getClass().equals(Manager.class)) {
      ...
    }
    if (obj.getClass().equals(Salesman.class)) {
      ...
    }
}

还应该注意, instanceof 也可以在子类的情况下工作,但这样做,它不会。

答案 4 :(得分:0)

请按照以下链接获取解决方案:

https://stackoverflow.com/a/34437757/3095589

可能会对你有所帮助......

答案 5 :(得分:0)

虽然其他答案完美地描述了如何实现您的要求,但您面临的目标通常被认为是面向对象设计中的不良做法

  1. 耦合:当您的代码根据对象的类型做出决策时,无论何时添加更多类型(即第三种User类型),都必须添加更多条件检查。这很糟糕,因为它会使代码维持指数级更难。添加其他子类时,您必须找到代码中可能需要特殊行为的所有位置。忘了为上面提到的其中一个地方做这件事,你的代码就破了。
  2. 使用instanceof意味着您需要以不同的方式处理超类的不同子类;所以超类可能没有足够的共享功能/数据作为超类首先?如果他们共享这么少的特征,为什么要把它们放在一起呢?
  3. 考虑重新设计代码。如果您仍然认为 Manager TicketSalesMan 必须从 User 继承,并且您需要在迭代循环中对它们执行某些操作,请考虑覆盖方法而不是使用instanceof。请看下面的代码:

    public abstract class User
    {
        public abstract void doOperation();
    }
    
    public class Manager extends User
    {
        public void doOperation()
        {
            // do stuff that managers do
        }
    }
    
    public class SalesMan extends User
    {
        public void doOperation()
        {
            // do stuff that salesmen do
        }
    }
    
    public class Main
    {
        public static final void main(String[] args)
        {
            ArrayList<User> users = getUsers();
            for(User u: users)
            {
                u.doOperation();
            }
        }
    }