Рассмотрим следующий пример,PECS не работает на типы возвращаемых с интерфейсом
class ClsA {}
class ClsB {}
interface IntA {}
interface IntB {}
И у меня есть 2 очень похожие методы:
static <T extends ClsA> T returnC() { // Here T extends the class
return null;
}
static <T extends IntA> T returnI() { // Here T extends the interface
return null;
}
И тогда метод вызывает:
ClsA ac = returnC(); // This works fine based on inference.
IntA ai = returnI(); // Similarly this works fine based on inference.
Но рассмотрите ниже 2:
ClsB bc = returnC(); // ERROR as expected.
Затмение Ошибка:
Bound mismatch: The generic method returnC() of type Testing is not applicable for the arguments(). The inferred type ClsB&ClsA is not a valid substitute for the bounded parameter
<T extends ClsA>
Но следующий код компилируется нормально:
IntB bi = returnI(); // Works fine
Почему что для интерфейса, дженерики, связанные не рассматривается типов возврата?
Подтверждено с помощью javac. И JDK7u40, и JDK8u20. –
PECS не имеет никакого отношения к вопросу, на самом деле :) –