[java] 객체가 인터페이스를 구현하는지 테스트

이것은 이전에 요청되었을 수도 있지만 빠른 검색은 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;
}


편집 : 좋아, 답변 주셔서 감사합니다. 특히 Damien Pollet과 Noldorin에게는 더 이상 인터페이스를 테스트하지 않도록 디자인을 다시 생각하게 만들었습니다.



답변

instanceof연산자는에서 작동합니까 NullPointerException안전한 방법입니다. 예를 들면 다음과 같습니다.

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

결과를 얻습니다. 이후:

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

결과는 false이며 instanceof연산자는 null 안전합니다 (게시 한 코드는 안전하지 않습니다).

instanceofClass # isInstance (Object)에 대한 내장 된 컴파일 타임 안전 대안입니다


답변

이것은해야합니다 :

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

예를 들어

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

로 평가됩니다 true.


답변

나는 선호한다 instanceof:

if (obj instanceof SomeType) { ... }

보다 훨씬 일반적이고 읽기 쉬운 SomeType.isInstance(obj)


답변

그것은 쉽다 :

   interf.isInstance(object)


답변

인터페이스를 테스트하려는 경우 :

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은 여러 인터페이스를 구현할 수 있도록 정의한 유형입니다. 이 코드를 사용하면 정의 된 인터페이스를 구현하는 유형 만 얻을 수 있습니다


답변

나는 오늘 밤 안드로이드 에서이 문제를 겪었고 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());
    }
}


답변

Apache commons-lang ArrayUtils를 사용하면 필요한 인터페이스가 객체의 인터페이스에 포함되어 있는지 확인하십시오

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