Следующий пример, хотя и кажется правильным, не скомпилируется (Eclipse Neon 3, Java 1.8):
class Test {
public static class SomeForm<IF extends SomeForm<IF>> {
}
public static class BaseFF<IF extends SomeForm<IF>> {
}
public static class AuxFF<IF extends SomeForm<IF>>
extends BaseFF<IF> {
}
public interface Interface<IF extends SomeForm<IF>, FF extends BaseFF<IF>> {
FF getFF1();
}
public static class ZBaseUnit<IF extends SomeForm<IF>, FF extends BaseFF<IF>>
implements Interface<IF, FF> {
@Override
public FF getFF1() {
return null;
}
}
public static class ZMyUnit<IF extends SomeForm<IF>, FF extends AuxFF<IF>>
extends ZBaseUnit<IF, FF> {
}
public static class ZMyCheck<IF extends SomeForm<IF>, U extends ZMyUnit<IF, ?>> {
U unit;
void f() {
BaseFF<IF> ff1 = unit.getFF1();
}
}
}
Eclipse говорит (в строке внутри метода f ()):
«Несоответствие типов: невозможно преобразовать из захвата # 2-of? В Test.BaseFF».
Однако, если я удалю метод getFF1 из интерфейса Interface (и аннотацию @Override в классе ZBaseUnit)компилируется.Есть ли какая-то логика за этим?Интуитивно понятно, что FF, переданный в Interface, такой же, как FF, переданный в ZBaseUnit, поэтому не должно быть никакой разницы ...
Кроме того, при добавлении метода в ZMyUnit не возникает ошибка:
void f() {
BaseFF<IF> ff1 = getFF1();
}
Буду признателен за любую помощь!