Очевидно, что между Javac и Eclipse есть некоторые различия.Тем не менее, главное здесь заключается в том, что javac является правильным в выдаче ошибки.В конечном счете, ваш код преобразует Maybe в Maybe , что является рискованным.
Вот переписывание метода visit ():
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;
}
Это переписывание практически идентичнок вашему коду, но он явно показывает назначение, которое вы пытаетесь выполнить от Maybe до Maybe .Это рискованно.Действительно, мой компилятор Eclipse выдает ошибку в строке назначения.Вот фрагмент кода, который использует этот риск для хранения Integer внутри объекта Maybe :
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
}