Извините, если это уже было объяснено, но я не нашел похожих нитей в Интернете.
Сегодня я открыл один класс проекта в среде IDE и увидел ошибку (красная подчеркивание), хотя проект был скомпилирован успешно.
Итак, код:
public interface DatasourceImplementation<T extends Entity> {
....
}
public interface Datasource<T extends Entity> {
....
}
public interface DsContext {
@Nullable
<T extends Datasource> T get(String name);
}
И теперь мы вызываем этот метод следующим образом:
DatasourceImplementation dsImpl = getDsContext().get("dsName");
Idea13 дает мне ошибку (несовместимые типы) - я думаю, что правильно.
В Idea14 здесь нет ошибок.
JDK компилирует его без ошибок - это печально.
Должен сказать, что в нашем проекте класс реализации интерфейса A всегда реализует интерфейс B (возможно, объясняет, почему Idea14 говорит, что это нормально), но, на мой взгляд, это не может оправдать это поведение - потому что обычно я могу создать класс, который реализует A и не реализует B. Я хочу статическую типизацию в моем коде, я не хочу видеть исключения выполнения класса выполнения.
Итак, кто здесь не прав?
Обновление. Добавить скриншот с реальными классами (не уверен, что он объяснит что-то большее, это так же, как я описал)