【发布时间】:2014-04-01 12:37:58
【问题描述】:
我试图理解为什么我会得到这些结果(这不是我预期的原因)”
public interface ICommandAble
{ }
public interface ILogAble extends ICommandAble
{ }
public interface IMonitorAble extends ICommandAble
{ }
public abstract class ClassAbs
{ }
public class A extends ClassAbs implements IMonitorAble, ILogAble
{ }
测试方法:
public void test()
{
A a=new A();
List<ICommandAble>commandList=new ArrayList<ICommandAble>()
if (a instanceof ILogAble)
{
ILogAble logAbleItem=(ILogAble)a;
commandList.add(logAbleItem);
}
if (a instanceof IMonitorAble) {
IMonitorAble monitorAbleItem=(IMonitorAble)a;
commandList.add(monitorAbleItem);
}
for(ICommandAble item: commandList)
{
if(item instanceof IMonitorAble)
{
log.debug("is monitorable");
}
if(item instanceof ILogAble)
{
log.debug("is logable");
}
}
输出是:
2013-04-22 18:25:00,498 com... [DEBUG] 是可监控的
2013-04-22 18:25:02,150 com.... [DEBUG] 是可记录的
2013-04-22 18:25:08,322 com.... [DEBUG] 是可监控的
2013-04-22 18:25:08,977 com.... [DEBUG] 是可记录的
我希望看到:。
2013-04-22 18:25:00,498 com... [DEBUG] 是可监控的
2013-04-22 18:25:02,150 com.... [DEBUG] 是可记录的
我在这里错过了什么?
我现在明白我在这里想念什么了。但是我应该如何重新设计它以使其在第二个实例中仅输入一次?我的意图是看到这个:
2013-04-22 18:25:00,498 com... [DEBUG] is monitorable
2013-04-22 18:25:02,150 com.... [DEBUG] is logable
有什么重新设计的建议吗?
否则,我将对所有内容进行双重执行,而我的意图是每个内容只执行一次。
谢谢, 射线。
【问题讨论】:
-
如果任一条件为真 (
a instanceof x || a instance of y),则将该对象添加到您的列表中。除了在编译器不知道传入值是 ICommandAble 的子类的情况下,您不需要将其转换为 ICommandAble。 -
或者使用各种消除重复的列表。
-
如果其中任何一个条件为真,这对我来说都不是一个好的解决方案。这听起来像是一个肮脏的解决方法。如果我有更多像“xAble”和“yAble”这样看起来很糟糕的对象怎么办。
-
如果您有一大堆并且想要为每个单独的 if 语句,如果应该包含对象,只需让您的 if 语句设置一个布尔标志。最后测试布尔值。
-
当然,如果您只想知道对象是否是 ICommandAble 的子类,只需执行
a instanceof ICommandAble。
标签: java oop polymorphism instanceof