为什么instanceof在这种情况下会返回成功

ray*_*man 1 java oop polymorphism instanceof

我试图理解为什么我得到这些结果(这不是我预期的原因)"

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
{ }
Run Code Online (Sandbox Code Playgroud)

测试方法:

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");
        }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

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
Run Code Online (Sandbox Code Playgroud)

有任何重新设计的建议吗?

否则我将获得所有内容的双重执行,而我的目的是只执行每一个.

谢谢,雷.

Old*_*eon 6

你已经添加了两个类对象A.A是可监视和可记录的,因此输出是正确的.

我在这里错过了什么?: - 转换对象不会更改其类型.