참조가 해당 객체의 정확한 유형으로 캐스트되었는지 확인하는 방법이 있는지 알고 싶습니다. 예를 들면 ...
String s = new String("test");
checkCast(s); //Returns true, since s has a dynamic and static type of String.
Object o = (Object) s;
checkCast(o); //Returns false, since the dynamic and static type of o are not equal.
실제 문제에 대한 배경 ...
아래와 같은 클래스 A, B, C의 계층이 있습니다.
class A {}
class B extends A {}
class C extends B {}
그리고 LinkedList<A>
A 오브젝트가 있습니다. 이 목록에는 위의 클래스가 포함될 수 있습니다. 다음과 같은 방법이 있습니다.
<T extends A> T getFirstObjInList(){
//Iterate over the list and return the first object that is of type T...
}
내 목록의 개체가 메서드에 전달 된 Generic Type인지 확인하는 방법을 알아야합니다. 삭제 등으로 인해 instanceof를 사용할 수 없으며 메서드의 제목을 변경하지 않는 것이 좋습니다. 즉, 매개 변수 또는 이와 유사한 것을 추가하는 것입니다.
내가 처음 시도한 것은 목록의 각 객체를 for 루프에서 T로 캐스팅하는 것이며 ClassCastException이 발생하면 반복을 계속하지만 분명히 내가 가진 계층 구조에서 작동하지 않았으므로 지금 찾고 있습니다. 객체가 동적 유형으로 캐스팅되었는지 확인하는 방법입니다. 목록의 객체가 지정된 유형이면 캐스트 될 때 정적 유형이 변경되지 않으므로 두 유형을 비교할 수 있으면 객체가 지정된 제네릭 유형의 인스턴스인지 알아낼 수 있습니다.
참고 : list.getFirst() instanceof T
유형 삭제로 인해 컴파일되지 않습니다.
지금까지 결론을 내리셨 겠지만, 타입 삭제로 인해 메서드 서명이 실행 가능하지 않습니다. 명시 적 유형을 전달하는 것이 좋습니다.
<T extends A> T getFirstObjInList(Class<T> type) {
for (A a : list) {
if (a.getClass() == type) {
return type.cast(a);
}
}
return null;
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다