내가 매개 변수의 클래스 확보해야하는 일반적인 방법이에 .getClass()을 주조 : 그것은보기의 컴파일러의 타입 시스템의 관점에서 밝혀으로유형 매개 변수
public static<S> void doSomething(S inst) {
@SuppressWarnings("unchecked")
Class<? extends S> cls = (Class<? extends S>) inst.getClass();
// do something with 'cls' and with 'inst'...
}
을, .getClass()
은 Class<?>
을 반환하고 Class<? extends S>
으로 내려가며 은 확인되지 않음 dow-cast입니다.
내 질문은 다음과 같습니다. 어떤 상황에서이 다운 캐스트가 안전하지 않을 수 있습니까?
IIUC이 메서드에 대한 모든 호출 사이트는 정적 (컴파일 타임) 유형 S 인 inst
매개 변수의 값을 전달해야합니다. 값의 동적 (런타임) 유형 D는 S 또는 그의 서브 타입이다. 따라서 inst.getClass()는 D
이 S
의 하위 유형 인 경우 Class<? extends S>
에 할당 할 수있는 Class<D>
객체를 반환합니다.
흥미 롭습니다. 이것은 실제로 허점을 보여주지 만 최소한 하나 이상의 체크되지 않은 캐스트 (즉,'inst = (S) new Object')가 필요합니다. –