如何创建检查实现是否满足接口的方法?

时间:2014-05-15 18:05:00

标签: java interface instanceof

我有一个接口(p)和一个实现(imp)。如果我在代码中执行以下操作,则检查有效:

if (!(imp instanceof p)) {
   logger.error(imp.getClass().getName()+ 
    " doesn't satisfy the interface "
   +p.getClass().getName());
   }

我尝试将其变为可调用方法,如下所示:

private boolean checkInterfaceImplementation(Object implemen, Object inter){
    return (implemen instanceof inter);
}

失败了。

然后我发现inter需要是特定类型,我不能使用通用对象。然后我发现了

"B.class.isAssignableFrom(A.getClass())"

然后我做了:

System.out.println("B.class.isAssignableFrom(A
                    .getClass())");

输出

  

我从this question.阅读了更多内容我的问题是"这是(#34; .isAssignableFrom"的第二个实现)是实现所述方法的首选或标准方式吗?这个现有的实现有没有办法产生问题?

2 个答案:

答案 0 :(得分:2)

很难理解你的问题。如果有必要,我会在收到更多详细信息时编辑,但作为一般经验法则 instanceof 是缺乏多态性和设计问题的指标。并非总是如此,但如果你是初学者,我会尝试尽可能少地使用它。

相反,请考虑为什么检查甚至存在。如果“imp”实现“p”,那么您保证任何“imp”将具有“p”中的所有方法。如果没有,您甚至可以在构建之前收到编译器错误。这是非常抽象的,所以我会做一些简单的例子。

public interface Runs {
     public void run();
}

public class Cat implements Runs {
     int numLegs;
     public Cat() {
          this.numLegs = 4;
     }
     public void run() {
          System.out.println("does whatever running cats do");
     }
}

public class Human implements Runs {
     int numLegs;
     public Human() {
          this.numLegs = 2;
     }
     public void run() {
          System.out.println("does whatever running humans do");
     }
}
 public class Main {
         public static void main(String[] args) {
              Cat cat = new Cat();
              Human human = new Human();

              ArrayList<Runs> listOfRunners = new ArrayList<Runs>();
              listOfRunners.add(cat);
              listOfRunners.add(human);
              Runs runner = listOfRunners.get(0);
              /* no compiler error because by implementing Runs we guarantee it has run() method */
              runner.run();
              runner = listOfRunners.get(1);
              /* It doesn't matter what the object is. We don't care if it is cat or human */
              runner.run();
         }
    }

答案 1 :(得分:1)

不确定你想要做什么,但这样的事情应该有效:

inter.getClass().isInstance(implemen)

尽管如此,你尝试做的最有可能的方式要好得多。