gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:01:20 25 4
gpt4 key购买 nike

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

父类是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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com