我正在研究一个学校项目,我需要创建一个包含两种类型对象的“ArrayList”,“manager”和“ticket salesmen”,因为我创建了一个抽象类“user”,这两种类型扩展了它,I创建了一个ArrayList类型“user”并在其中存储了“manager”和“ticket salesmen”,但是如何访问这两种类型呢?我只能以“用户”的身份访问列表中的每个元素,并获取抽象类具有的属性,而不是“经理”或“票务推销员”。如何获取这两个对象的属性并且可以识别对象类型,因为在哪个类中它是一个实例?
答案 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)
答案 5 :(得分:0)
虽然其他答案完美地描述了如何实现您的要求,但您面临的目标通常被认为是面向对象设计中的不良做法:
User
类型),都必须添加更多条件检查。这很糟糕,因为它会使代码维持指数级更难。添加其他子类时,您必须找到代码中可能需要特殊行为的所有位置。忘了为上面提到的其中一个地方做这件事,你的代码就破了。考虑重新设计代码。如果您仍然认为 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();
}
}
}