java - 从列表中的对象获取原始类

标签 java

作为练习,我必须为游泳池编写一个非常简单的软件。

父类是User

AdultChild 是扩展 User 的两个类。

DisabledChildDisabledAdult 扩展了 User 并实现了一个接口(interface) Disabled ,只使用一个额外的方法来打印“我被禁用了!”

主要我根据年龄参数和“禁用” boolean 值创建这些类的不同对象,然后我将它们放入列表中,如下所示:

public void insertData()
{
   int age;
   Adult a = null;
   DisabledAdult da = null;
   Scanner scanIn = new Scanner(System.in);
   List l = new ArrayList();

  do {

   System.out.println("Insert user name, type 'quit' to exit");
   name = scanIn.next();

   System.out.println("Insert age");
   age = scanIn.nextInt();

        if (age > 16) {
            System.out.println("Is the adult disabled? ( y/n)");
            String disabled = scanIn.next();
            if("y".equals(disabled))
            {
               da = new DisabledAdult();
               l.add(da); // l is a list!
            } else
            {
               a = new Adult();
               l.add(a);
            }
        }

        else{
           // similar as above, but for children.
        }

    } while (!"quit".equals(name));

    scanIn.close();

问题来了:当我将东西放入我的列表中时,它们变成了对象,即使使用 .getClass().getName() 我也无法返回到它们的原始类。所以我不能使用他们的特定方法,比如从 Disabled 接口(interface)实现的方法。

我被迫将 Obj 转换为一个 User(因为游泳池里的每个人都是一个用户),就像这样:

        for (Object obj : l) {
              User u = (User) obj;
    }

但我不能使用 DisabledAdult 或 DisabledChild 的额外方法,因为它们是在 Disabled 接口(interface)中定义的,而不是 User!

如果我这样做

obj.getClass().getName();

我可以看到他们的原始类,但我只能访问对象方法。

我想我可以这样做:

if (obj instanceof Adult){
    Adult a = (Adult) obj;
}
if (obj instanceof Child){
    Child c = (Child) obj;
}
...

但它看起来很糟糕,因为我应该为每种类型的用户检查这个,他们是否被禁用等等。

我能做什么?

谢谢。

最佳答案

使用generics为你的 list 。由于 l 中的所有对象都是 User,因此您应该将其指定为类型参数。

代替:

List l = new ArrayList();

使用:

List<User> l = new ArrayList<User>();
// or List<User> l = new ArrayList<>(); if you are on Java 7 or higher.

这样,当您从列表中获取用户时,您无需转换回 User

此外,要检查禁用用户,您可以这样做:

if(user instanceof Disabled) {
    Disabled disabledUser = (Disabled) user;
    //do disabled-specific stuff here on disabledUser, which is the same as user
}

这将允许您为残障用户做特定于残障人士的事情。

关于java - 从列表中的对象获取原始类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25575346/

相关文章:

java - 使用 JNDI 在 Spring Boot 中配置多个数据源

java - UCanAccess中执行PreparedStatement报错"feature not supported"

java - 从 firebase Firestore 数据库中的存储下载图像时出错

java - 在数据库中存储 jXDatePicker1 日期值时出错

java - 手工计算~100

java - fragment 标签的使用

java - Java中多维数组的使用

Java着色字符GUI

java - JSP下拉不提交对象

java - GWT AsyncCallback 不填充静态成员