Проверить, реализует ли объект интерфейс

Это, вероятно, было задано раньше, но быстрый поиск вызвал тот же вопрос, заданный для С#. Смотрите здесь.

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

Я как-то понял решение, но это просто не достаточно удобно, чтобы часто его использовать в случае 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;
}


EDIT: Хорошо, спасибо за ваши ответы. Особенно для Дэмиена Поллета и Нолдорина, вы заставили меня переосмыслить мой проект, чтобы я больше не тестировал интерфейсы.

Ответ 1

Оператор instanceof выполняет работу в NullPointerException безопасный способ. Например:

 if ("" instanceof java.io.Serializable) {
     // it true
 }

дает значение true. Так как:

 if (null instanceof AnyType) {
     // never reached
 }

дает false, оператор instanceof имеет нулевой уровень безопасности (код, который вы отправили, не является).

instanceof - это встроенная безопасная альтернатива класС# isInstance (Object) p >

Ответ 2

Это должно сделать:

public static boolean implementsInterface(Object object, Class interf){
    return interf.isInstance(object);
}

Например,

 java.io.Serializable.class.isInstance("a test string")

принимает значение true.

Ответ 3

Я предпочитаю instanceof:

if (obj instanceof SomeType) { ... }

который является гораздо более распространенным и читаемым, чем SomeType.isInstance(obj)

Ответ 4

это было легко:

   interf.isInstance(object)

Ответ 5

Если вы хотите проверить интерфейсы:

public List<myType> getElement(Class<?> clazz) {
    List<myType> els = new ArrayList<myType>();
    for (myType e: this.elements.values()) {
        if (clazz.isAssignableFrom(e.getClass())) {
            els.add(e);
        }
    }
    return els;

}

clazz - это интерфейс, а myType - это определенный вами тип, который может реализовывать несколько интерфейсов. С помощью этого кода вы получаете только типы, которые реализуют определенный интерфейс

Ответ 6

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

Вот рабочий пример с фактическим интерфейсом, использующим javascript android. Он проверяет активность, которая вызвала реализованный интерфейс AboutDialogListener перед тем как попытаться создать поле AboutDialogListener.

public class About extends DialogFragment implements OnClickListener,
    OnCheckedChangeListener {

public static final String FIRST_RUN_ABOUT = "com.gosylvester.bestrides.firstrunabout";


public interface AboutDialogListener {
    void onFinishEditDialog(Boolean _Checked);
}

private AboutDialogListener adl;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    Activity a = this.getActivity();
    if (AboutDialogListener.class.isInstance(a)) {
        adl = (AboutDialogListener) a;
        }
}

... Позже я проверяю, было ли поле adl равным null перед вызовом интерфейса

@Override
public void onStop() {
    super.onStop();
    sharedPref.edit().putBoolean(About.FIRST_RUN_ABOUT, _Checked).commit();
    // if there is an interface call it.
    if (adl != null) {
        adl.onFinishEditDialog(is_Checked());
    }
}

Ответ 7

С Apache commons-lang ArrayUtils, посмотрите, нужен ли интерфейс, который вам нужен, в интерфейсах вашего объекта

public static Boolean implementsInterface(Object object, Class interf){
    return ArrayUtils.contains(object.getClass().getInterfaces(), interf);
}