【问题标题】:Why instanceof returns success in this scenario为什么 instanceof 在这种情况下返回成功
【发布时间】: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


【解决方案1】:

您添加了两个A 类的对象。 A 既可监控又可记录,因此输出正确。

我在这里遗漏了什么? :- 投射一个对象不会改变它的类型。

【讨论】:

【解决方案2】:

你拥有的是A类的一个对象。这是IMonitorAble和ILogAble的一个实例。通过将其转换为其中一个接口,它仍然是 A 的对象。 因此,您的 List 中有两次相同的对象,并且 for 循环中的两个 if 语句对于该对象都是正确的。

【讨论】:

    猜你喜欢
    • 2016-03-02
    • 2014-09-12
    • 2018-04-26
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多