Проверьте, реализует ли объект интерфейс - PullRequest
136 голосов
/ 20 апреля 2009

Возможно, это уже задавалось ранее, но быстрый поиск поднял только тот же вопрос, который задавался для 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;
}


РЕДАКТИРОВАТЬ: Хорошо, спасибо за ваши ответы. Особенно для Дэмиена Поллета и Нолдорина, вы заставили меня переосмыслить мой дизайн, чтобы я больше не тестировал интерфейсы.

Ответы [ 7 ]

174 голосов
/ 20 апреля 2009

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

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

дает истину. Так как:

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

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

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

.
40 голосов
/ 20 апреля 2009

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

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

Например,

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

оценивается как true.

7 голосов
/ 20 апреля 2009

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

if (obj instanceof SomeType) { ... }

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

3 голосов
/ 01 марта 2013

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

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

}

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

3 голосов
/ 20 апреля 2009

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

   interf.isInstance(object)
1 голос
/ 22 августа 2013

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

Вот рабочий пример с реальным интерфейсом, использующим Android Java. Он проверяет активность, вызвавшую реализацию интерфейса 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());
    }
}
0 голосов
/ 20 марта 2013

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

public static Boolean implementsInterface(Object object, Class interf){
    return ArrayUtils.contains(object.getClass().getInterfaces(), interf);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...