我偶然发现了这种情况,但我不知道如何以正确的方式处理它:
class Myclass { }
class MyclassWithAwesomeStuff extends Myclass {
public boolean awesomeStuff;
}
我将myclass对象保存在一个arraylist中,然后在此列表中进行迭代:
for(Myclass m : list) {
//here I want to check if awesomeStuff is true, in case it is a MyclasswithAwesomeStuff
}
这里的问题是:父类Myclass不知道awesomeStuff属性(它不应该因为这是仅与派生类一起出现的特性)。但我怎么能管理呢?问题是,arraylist包含Myclass和MyclassWithAwesomeStuff元素,而foreach循环总是将它们强制转换为Myclass。
我想知道这是否是设计失败?
//编辑:
好的,为了让我的问题更加明确,这里有更多信息。我正在努力建立一家小咖啡馆:
class Coffee { }
class CoffeeMix extends Coffee {
public boolean shaken;
}
我将咖啡项目保存在数组列表中:
ArrayList<Coffee> coffees = new ArrayList<Coffee>();
因此在此数组列表中存在普通咖啡对象和咖啡混合对象。现在我要显示所有咖啡混合对象,这些对象是动摇的:
for(Coffee c : coffees) {
//here is the same problem as above
}
正如我从答案/评论中看到的那样:instanceof似乎是一个坏主意,因为它将背后的想法搞砸了,两个类实现的界面也是一个坏主意,因为正常的咖啡不能动摇。那么如何处理呢?
答案 0 :(得分:2)
使用m
运算符测试MyclassWithAwesomeStuff
是否为instanceof
。
if (m instanceof MyclassWithAwesomeStuff)
{
MyclassWithAwesomeStuff mwas = (MyclassWithAwesomeStuff) m;
// Now you can access "awesomeStuff" with "mwas"
}
答案 1 :(得分:1)
只需使用界面:
interface AwesomeStuffable{
public boolean isAwesome();
}
让你的类实现它:
class MyClass implements AwesomeStuffable{
public boolean isAwesome(){
//your logic here
}
}
让你的ArrayList
只保留AwesomeStuffable
个对象。
答案 2 :(得分:0)
为了让自己畅通无阻,您可以执行以下操作:
if (m instanceof MyClassWithAwesomeStuff) {
if (((MyClassWithAwesomeStuff) m).awesomeStuff) {
}
}
但是,使用instanceof会破坏继承的目的,并且在代码中仅list
中的某些对象需要检查此标志似乎是一个设计缺陷。如果扩展上下文,可能会建议更好的内容。