개체가 인터페이스를 구현하는지 테스트합니다.
이것은 이전에 질문한 적이 있을 것입니다만, 재빠른 검색에서는, 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;
}
EDIT: Ok, thanks for your answers. Especially to Damien Pollet and Noldorin, you made me rethink my design so I don't test for interfaces anymore.
오퍼레이터는 안전한 방법으로 작업을 수행합니다.예를 들어 다음과 같습니다.
if ("" instanceof java.io.Serializable) {
// it's true
}
참된 결과입니다.이후:
if (null instanceof AnyType) {
// never reached
}
잘못된 결과를 낳다instanceofoperator is null safe(게시된 코드는 null safe)입니다.
instanceof는 Class#is 대신 내장된 컴파일 시 안전한 옵션입니다.인스턴스(개체)
이것은 다음과 같습니다.
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은 다수의 인터페이스를 구현할 수 있는 정의된 유형입니다.이 코드를 사용하면 정의된 인터페이스를 구현하는 유형만 얻을 수 있습니다.
저는 오늘 밤 안드로이드에서 이 문제를 겪었습니다.그리고 자바독 솔루션을 살펴본 후 자바독 설명보다 조금 더 필요한 저 같은 분들을 위해 이 실질적인 솔루션을 생각해냈습니다.
다음은 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 Array Utils에서는 필요한 인터페이스가 객체의 인터페이스에 포함되어 있는지 확인합니다.
public static Boolean implementsInterface(Object object, Class interf){
return ArrayUtils.contains(object.getClass().getInterfaces(), interf);
}
언급URL : https://stackoverflow.com/questions/766106/test-if-object-implements-interface
'programing' 카테고리의 다른 글
| Vue js. 재귀 구성 요소가 내 인생을 망친다. (0) | 2022.08.25 |
|---|---|
| router.push(location, onComplete?, onAbort 등)를 사용한 onComplete 및 onAbort 콜백이 있습니까? (0) | 2022.08.25 |
| html.erb 템플릿의 v-model이 함수()를 렌더링함 ({ [value code] } ) (0) | 2022.08.24 |
| C에서 어레이만 포함하는 구조를 선언하는 이유는 무엇입니까? (0) | 2022.08.24 |
| 어레이에서 구성 요소 삭제, vuejs에서 잘못된 구성 요소 제거 (0) | 2022.08.24 |