에서와 유형을 공급하여 컴파일러 javac의 이클립스 사이에 약간의 차이가 분명히있다. 그러나 여기서 요점은 javac이 오류를 방출하는 것이 맞다는 것입니다. 궁극적으로 코드가 어쩌면 <BarExtendsFoo>을 <Foo>으로 변환하는 것이 위험합니다. 여기
는 방문() 메소드의 재 작성의 :
public static <TV, TG extends TV> Maybe<TV> something(final TG value) {
return new Maybe<TV>(value);
}
public static class Foo { }
public static class BarExtendsFoo extends Foo { }
public Maybe<Foo> visit() {
Maybe<BarExtendsFoo> maybeBar = something(new BarExtendsFoo());
Maybe<Foo> maybeFoo = maybeBar; // <-- Compiler error here
return maybeFoo;
}
이 재 작성 코드에 실질적으로 동일하지만, 명시 적으로 푸 아마 <에 BarExtendsFoo > 어쩌면 <에서 만들려고 노력하고있는 할당을 보여줍니다 >. 이것은 위험합니다. 실제로 제 이클립스 컴파일러는 할당 라인에서 오류를 발생시킵니다.
public static void bomb() {
Maybe<String> maybeString = new Maybe<String>("");
// Use casts to make the compiler OK the assignment
Maybe<Object> maybeObject = (Maybe<Object>) ((Object) maybeString);
maybeObject.set(new Integer(5));
String s = maybeString.get(); // Runtime error (classCastException):
// java.lang.Integer incompatible with
// java.lang.String
}
동작하는 예제와 클래스를 누락 쉽게 사람들이 도움을 할 수 있도록합니다 : 그것은 당신이 메소드를 호출 할 방법을 컴파일러와 인간의 독자 모두에게 지금은 명확합니다. –
간단한 질문이 있습니다 ... 컴파일러는 호출 할 때 반환 할 실제 유형을 어떻게 알 수 있습니까 : 'Maybe.something (new BarExtendsFoo())'? –
왜 public @Nonnull 어쩌면 Foo 확장> visit() {...} ? –