T
в Generic<T extends ISpecific>
допускается равным любому типу, расширяющему ISpecific
.
Это означает, что может быть ISpecificImplementer
или может быть другим подходящим типом.Выбор T
не зависит от способа выбора;все зависит от того, что создает экземпляр Generic<T>
.
Внутри getValue()
вы пытаетесь вернуть ISpecificImplementer
.Теперь T
может быть ISpecificImplementer
, или это может быть другой тип, который не совместим.Так что требуется актерский состав.А приведение к универсальному типу генерирует предупреждение, потому что оно обходит безопасность типов, которую должны обеспечить универсальные типы.
Предположим, что SomeOtherType
- это другой класс, реализующий ISpecific
.Если вы создадите экземпляр Generic<SomeOtherType>
и позвоните getValue()
, вы получите исключение при использовании, потому что getValue()
должно вернуть SomeOtherType
, но на самом деле попробуйте и верните ISpecificImplementer
.Вот почему есть предупреждение о компиляции.