이것은 좁은 사례의 예입니다.Java Generics :: 유형 안전을 제공하지 못 했습니까?
아래의 코드를 살펴 : 나를 겁 무엇
이class Holder<T> {
private T t;
public Holder(T t) {
this.t = t;
}
public T getValue() {
return t;
}
}
public class FooMain {
private static Object newHolder() {
return new Holder<Integer>(3);
}
public static void main(String args[]) {
Holder<String> hs = (Holder<String>) newHolder(); // line-18
String s = hs.getValue(); // line-19
}
}
피할 수 ClassCastException
이 라인 (18)에 라인 (19)와하지에 발생됩니다 있다는 것입니다!
따라서 코드에 Holder<String>
유형의 객체를 사용하면 getValue
이 String
을 반환한다는 것을 보장하기에 충분하지 않습니다. 이 객체가 어떻게 구성되었는지도 조사해야합니다!
는 그 유형 소거 여기에 역할을 이해하지만 위의 의미가 얼마나 넓은 모르겠습니다. 내 특정 경우에는 newHolder
-corresponding 방법은 외부 라이브러리에 정의 java.lang.Object
그래서 난이 캐스트를 할 필요가 반환됩니다.
외부 라이브러리 메소드'Object newHolder()'에 의해 반환 된 객체가 'Holder'이 될 것이므로 컴파일러 경고에도 불구하고 명시 적으로 결과를 캐스팅한다고 가정합니다. 컴파일러에게 말하고있는 것을 의미합니다. * 나는 잘 압니다. * 그러나 당신의 가정은 틀린 것입니다. 그러한 결정을 내릴 때, 당신은 가정을해서는 안되지만 100 % 확실 할 것입니다. –
관련 : http://stackoverflow.com/a/12209857/697449 –