作为练习,我必须为游泳池编写一个非常简单的软件。
父类是User。
Adult 和Child 是扩展 User 的两个类。
DisabledChild 和 DisabledAdult 扩展了 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/