Проверить, реализует ли объект интерфейс
Это, вероятно, было задано раньше, но быстрый поиск вызвал тот же вопрос, заданный для С#. Смотрите здесь.
В основном я хочу проверить, что данный объект реализует данный интерфейс.
Я как-то понял решение, но это просто не достаточно удобно, чтобы часто его использовать в случае 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);
}