java - 检查子类的属性

标签 java class

我偶然发现了这种情况,但我不知道如何正确处理:

class Myclass { }
class MyclassWithAwesomeStuff extends Myclass {
    public boolean awesomeStuff;
}

我将 Myclass 对象保存在数组列表中,并稍后遍历此列表:

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似乎是一个坏主意,因为它把 oo 背后的想法搞砸了,两个类都实现的接口(interface)也是一个坏主意,因为普通的咖啡不能摇晃。那么如何处理呢?

最佳答案

使用 instanceof 运算符测试 m 是否为 MyclassWithAwesomeStuff

if (m instanceof MyclassWithAwesomeStuff)
{
    MyclassWithAwesomeStuff mwas = (MyclassWithAwesomeStuff) m;
    // Now you can access "awesomeStuff" with "mwas"
}

关于java - 检查子类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16658109/

相关文章:

java - 如何配置 tomcat 以便我可以在本地主机上运行我的(java)网络应用程序

java 从哈希集中删除元素会破坏 while 循环并留下 nul 错误

java - 为什么 Java 不理解我放在这个多维数组中的对象的类?

c++ - 任何/某些 C++ 编译器中是否有允许从 native (基本)类型继承的选项?

java - 如何从java中的Array类类型对象中检索值?

class - 条件类导入/加载

java - ClassCastException 使用 Class.cast 使用泛型

java - 您将如何分析对于内存来说太大的文件?

java - 将 List<T> 转换为 Collection<Object[]> 以进行 JUnit 参数化测试

java - 使用 java 下载一个大文件,穿过大小限制的防火墙。