런타임에 하위 클래스가 클래스의 인스턴스인지 확인하는 방법은 무엇입니까?
이 질문에 이미 답변이 있습니다.
Android 앱 테스트 스위트 B
에는 뷰가있는 다음과 같은 클래스 가 있습니다.
public class A extends B {
... etc...
}
이제 개체를 포함 할 수있는 뷰 개체 목록 A
이 있지만이 경우에는 하위 클래스 또는 "인스턴스"인 경우에만 관심이 B
있습니다. 다음과 같은 작업을하고 싶습니다.
ArrayList<View> viewList = getViews();
Iterator<View> iterator = viewList.iterator();
while (iterator.hasNext() && viewList != null) {
View view = iterator.next();
if (view.getClass().isInstance(B.class)) {
// this is an instance of B
}
}
문제는 객체를 if
만날 때 A
"인스턴스"로 평가되지 않는다는 것 B
입니다. 할 방법이 isSubclassOf
있나요?
이 메서드에 대한 API를주의 깊게 읽어야합니다. 때로는 매우 쉽게 혼동 될 수 있습니다.
다음 중 하나입니다.
if (B.class.isInstance(view))
API 말한다 : 지정된 개체 (매개 변수) 가이 클래스 (메소드를 호출하는 클래스 개체 ) 가 나타내는 개체와 할당 호환되는지 확인합니다.
또는:
if (B.class.isAssignableFrom(view.getClass()))
API 말한다 :이 Class 객체 가 나타내는 클래스 또는 인터페이스가 지정된 Class 매개 변수가 나타내는 클래스 또는 인터페이스와 동일하거나 수퍼 클래스 또는 수퍼 인터페이스인지 판별합니다.
또는 (반성과 추천하지 않고) :
if (view instanceof B)
if(view instanceof B)
뷰가 B 또는 하위 클래스 A (또는 해당 문제에 대한 B의 하위 클래스)의 인스턴스 인 경우 true를 반환합니다.
아마도 내가 뭔가를 놓치고 있지만 이것으로 충분하지 않을 것입니다.
if (view instanceof B) {
// this view is an instance of B
}
Class.isAssignableFrom()
-인터페이스에서도 작동합니다. 원하지 않으면에 getSuperclass()
도달 할 때까지 전화를 걸어 테스트 해야합니다 Object
.
다른 방법은 다음과 같습니다. B.class.isInstance(view)
SQLRecoverableException vs SQLException 검사와 같은 다형성이 있다면 그렇게 할 수 있습니다.
try {
// sth may throw exception
....
} catch (Exception e) {
if(SQLException.class.isAssignableFrom(e.getCause().getClass()))
{
// do sth
System.out.println("SQLException occurs!");
}
}
간단히 말해
ChildClass child= new ChildClass();
if(ParentClass.class.isAssignableFrom(child.getClass()))
{
// do sth
...
}
나는 이것을 실제로 사용한 적이 없지만 view.getClass().getGenericSuperclass()
'Program Tip' 카테고리의 다른 글
Jquery 입력 배열 필드 가져 오기 (0) | 2020.11.06 |
---|---|
Owin Twitter 로그인-유효성 검사 절차에 따라 원격 인증서가 유효하지 않습니다. (0) | 2020.11.06 |
변수, 객체 및 참조의 차이점은 무엇입니까? (0) | 2020.11.06 |
Python의 AWS Lambda 가져 오기 모듈 오류 (0) | 2020.11.06 |
시간 명령에 대한 사용자 정의 형식 (0) | 2020.11.06 |