Возможно, это уже задавалось ранее, но быстрый поиск поднял только тот же вопрос, который задавался для C #. Посмотреть здесь.
В основном я хочу проверить, реализует ли данный объект данный интерфейс.
Я вроде нашел решение, но это не достаточно удобно, чтобы использовать его часто в операторах if или case, и мне было интересно, не имеет ли Java встроенного решения.
public static Boolean implementsInterface(Object object, Class interf){
for (Class c : object.getClass().getInterfaces()) {
if (c.equals(interf)) {
return true;
}
}
return false;
}
РЕДАКТИРОВАТЬ: Хорошо, спасибо за ваши ответы. Особенно для Дэмиена Поллета и Нолдорина, вы заставили меня переосмыслить мой дизайн, чтобы я больше не тестировал интерфейсы.
Ответы:
instanceof
Оператор делает работу вNullPointerException
безопасном способе. Например:дает истину. Поскольку:
возвращает false,
instanceof
оператор является нулевым (код, который вы разместили, не является безопасным).instanceof - это встроенная безопасная альтернатива Class # isInstance (Object) во время компиляции
источник
MyClass.class
илиMyInterface.class
в вашем исходном коде. Литералы класса могут ссылаться на классы, интерфейсы и примитивные типы и возвращать соответствующий экземпляр класса Class. Моя точка зрения заключается в том, что OP использует не литерал класса, а экземпляр класса, а, к сожалению, оператор правой частиinstanceof
ключевого слова должен быть литералом класса, а не экземпляром класса.Это должно сделать:
Например,
оценивает до
true
.источник
Я предпочитаю
instanceof
:что гораздо более распространено и читаемо, чем
SomeType.isInstance(obj)
источник
if (obj instanceof SomeType) { ... }
это статическое (то есть - оно не может измениться во время выполнения) иSomeType.isInstance(obj)
динамическое.это было легко :
источник
Если вы хотите проверить интерфейсы:
}
clazz - это интерфейс, а myType - это определенный вами тип, который может реализовывать несколько интерфейсов. С помощью этого кода вы получаете только типы, которые реализуют определенный интерфейс
источник
У меня была эта проблема сегодня вечером с android, и после просмотра решений javadoc я нашел это реальное рабочее решение только для таких людей, как я, которым нужно немного больше, чем объяснение javadoc.
Вот рабочий пример с реальным интерфейсом, использующим Android Java. Он проверяет активность, вызвавшую реализацию интерфейса AboutDialogListener, прежде чем пытаться преобразовать поле AboutDialogListener.
... Позже я проверяю, является ли поле adl! Null перед вызовом интерфейса
источник
С Apache commons-lang ArrayUtils посмотрите, содержится ли требуемый интерфейс в интерфейсах вашего объекта
источник