1

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

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

有什么重新设计的建议吗?

否则,我将对所有内容进行双重执行,而我的意图是每个内容只执行一次。

谢谢,雷。

4

2 回答 2

6

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

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

于 2013-04-22T15:33:40.070 回答
1

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

于 2013-04-22T15:38:10.527 回答