이것은 타사 라이브러리 API의 실제 예이지만 단순화되었습니다.
Oracle JDK 8u72로 컴파일
다음 두 가지 방법을 고려하십시오.
<X extends CharSequence> X getCharSequence() {
return (X) "hello";
}
<X extends String> X getString() {
return (X) "hello";
}
둘 다 "체크되지 않은 캐스트"경고를보고합니다. 이유가 있습니다. 나를 방해하는 것은 왜 전화 할 수 있는지
Integer x = getCharSequence();
그리고 컴파일? 컴파일러는 Integer구현하지 않는 것을 알고 있어야합니다 CharSequence. 전화
Integer y = getString();
예상대로 오류를 제공합니다
incompatible types: inference variable X has incompatible upper bounds java.lang.Integer,java.lang.String
누군가 왜이 행동이 유효한 것으로 설명 할 수 있습니까? 어떻게 유용할까요?
클라이언트는이 호출이 안전하지 않다는 것을 모릅니다. 클라이언트 코드는 경고없이 컴파일됩니다. 컴파일에서 오류에 대해 경고하지 않는 이유는 무엇입니까?
또한이 예제와 어떻게 다른가요?
<X extends CharSequence> void doCharSequence(List<X> l) {
}
List<CharSequence> chsL = new ArrayList<>();
doCharSequence(chsL); // compiles
List<Integer> intL = new ArrayList<>();
doCharSequence(intL); // error
전달하려고하면 List<Integer>예상대로 오류가 발생합니다.
method doCharSequence in class generic.GenericTest cannot be applied to given types; required: java.util.List<X> found: java.util.List<java.lang.Integer> reason: inference variable X has incompatible bounds equality constraints: java.lang.Integer upper bounds: java.lang.CharSequence
이것이 오류로보고되면 왜 Integer x = getCharSequence();그렇지 않습니까?
Integer x = getCharSequence();은 컴파일되지만 RHS에서의 캐스팅은 컴파일Integer x = (Integer) getCharSequence();실패