如何在Java中检查对象是否实现了特定接口,而不是该接口的后代

时间:2013-04-10 18:46:48

标签: java class interface instanceof

我有一个树结构,其中一些节点必须只包含实现特定接口的对象。但是存在扩展该接口的接口,并且实现它们的对象不应该包含在节点中。
所以我需要检查对象是否严格实现了特定的接口。

public interface IProcessCell {...}
public interface IMethodCell extends IProcessCell {...}

IProcessCell processInstance = new IProcessCell() {...}
IMethodCell methodInstance = new IMethodCell() {...}

/** Method implementing desired check */
public boolean check(IProcessCell instance) {...}

方法检查必须对processInstance返回true,但对于methodInstance

则返回false

4 个答案:

答案 0 :(得分:3)

您可以使用http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getInterfaces()

但对我来说,你要做的事就是修补写得不好的应用程序。对我来说,更好的方法是创建一个新的接口(只有期望的对象将实现),并使“树结构”节点需要特定的接口。

答案 1 :(得分:2)

您可以使用getInterfaces获取已实现接口的列表。

假设您已将实例投放到所需的界面,则只需测试yourInstance.getClass().getInterfaces().length==1

答案 2 :(得分:1)

Class实现了getInterfaces()方法。它返回一个Class []。使用此方法,您可以迭代并进行比较,直到找到或找不到为止。 http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getInterfaces()

答案 3 :(得分:0)

您可以在节点上执行getClass().getInterfaces(),然后遍历返回的类并检查从您关注的特定接口可分配的数量。所以如果你有:

interface A {
}

interface B extends A {
}

class NodeA implements A {
}

class NodeB implements B {
}

如果您正在寻找一个只能实现A的节点实例,那么您应该能够:

new NodeA().getClass().getInterfaces();
new NodeB().getClass().getInterfaces();

并且在每种情况下检查1)其中一个接口是A,并且2)A.class.isAssignableFrom(interface)对于其他返回的接口返回false。