제네릭을 사용한 런타임 유형 검사를위한 두 가지 옵션 :
옵션 1-생성자 손상
indexOf (...)를 재정의하고 전체 컬렉션을 반복하는 자신을 저장하기 위해 성능을 위해 유형을 확인하려고한다고 가정 해 봅시다.
다음과 같이 더러운 생성자를 만드십시오.
public MyCollection<T>(Class<T> t) {
this.t = t;
}
그런 다음 isAssignableFrom 을 사용 하여 유형을 확인할 수 있습니다 .
public int indexOf(Object o) {
if (
o != null &&
!t.isAssignableFrom(o.getClass())
) return -1;
//...
객체를 인스턴스화 할 때마다 스스로 반복해야합니다.
new MyCollection<Apples>(Apples.class);
가치가 없다고 결정할 수도 있습니다. ArrayList.indexOf (...) 구현 에서 형식이 일치하는지 확인하지 않습니다.
옵션 2-실패하자
알 수없는 유형이 필요한 추상 메소드를 사용해야하는 경우 실제로 원하는 것은 컴파일러가 instanceof 에 대한 울음을 멈추는 것 입니다. 다음과 같은 방법이 있다면 :
protected abstract void abstractMethod(T element);
다음과 같이 사용할 수 있습니다.
public int indexOf(Object o) {
try {
abstractMethod((T) o);
} catch (ClassCastException e) {
//...
컴파일러를 속이기 위해 객체를 T (일반 유형)로 캐스팅하고 있습니다. 캐스트는 런타임에 아무것도 수행하지 않지만 잘못된 유형의 객체를 추상 메소드에 전달하려고하면 여전히 ClassCastException이 발생합니다.
참고 1 : 추상 메소드에서 확인되지 않은 추가 캐스트를 수행하는 경우 여기에서 ClassCastException이 발생합니다. 그것은 좋거나 나쁠 수 있으므로 생각하십시오.
참고 2 : instanceof를 사용할 때 무료 null 검사가 제공됩니다 . 사용할 수 없으므로 맨손으로 null을 확인해야 할 수도 있습니다.
Class.isAssignableFrom
.