Как проверить, реализует ли объект определенный интерфейс, но не потомки этого интерфейса, в Java

У меня есть древовидная структура, где некоторые узлы должны содержать только объекты, реализующие определенный интерфейс. Но есть интерфейсы, расширяющие этот интерфейс, и реализующие их объекты не должны содержаться в узлах.
Поэтому мне нужно проверить, реализует ли объект строго определенный интерфейс.

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) {...}

Проверка метода должна возвращать true для processInstance и false для methodInstance.


person NightmaresSeller    schedule 10.04.2013    source источник
comment
Может быть, вы можете предоставить нам пример с выдуманными именами. Было бы легче понять, что вы пытаетесь сделать.   -  person vptheron    schedule 10.04.2013
comment
Это кажется плохой идеей. Если Foo является интерфейсом, расширяющим Bar, то Bar должен использоваться везде, где должен использоваться Foo.   -  person Louis Wasserman    schedule 10.04.2013
comment
Возможно, поможет оператор [instanceOf][1]? [1]: stackoverflow.com /вопросы/631099/   -  person daneshjai    schedule 10.04.2013


Ответы (4)


Вы можете использовать http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getInterfaces%28%29

но для меня то, что вы пытаетесь сделать, похоже на исправление плохо написанного приложения. Для меня лучший способ - создать новый интерфейс (который будет реализовывать только желаемый объект) и сделать так, чтобы узлы "древовидной структуры" требовали этого конкретного интерфейса.

person Fiisch    schedule 10.04.2013
comment
Спасибо, что указали мне на мою ошибку. Создание отдельных интерфейсов для узлов в моем проекте оказалось простой задачей. Как я не подумал об этом раньше? - person NightmaresSeller; 10.04.2013

Вы можете получить список реализованных интерфейсов, используя getInterfaces.

Предполагая, что вы уже привели свой экземпляр к нужному интерфейсу, вам просто нужно проверить, что yourInstance.getClass().getInterfaces().length==1

person Denys Séguret    schedule 10.04.2013

Класс реализует метод getInterfaces(). Он возвращает класс []. Используя это, вы можете повторять и сравнивать, пока не найдете или не найдете. http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getInterfaces()

person Jerry Hoerig    schedule 10.04.2013

Вы можете выполнить 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 для других возвращенных интерфейсов.

person Jeff    schedule 10.04.2013