我有一个接口(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"的第二个实现)是实现所述方法的首选或标准方式吗?这个现有的实现有没有办法产生问题?
答案 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)
尽管如此,你尝试做的最有可能的方式要好得多。