Ваш CityConverter extends AbstractConverter
и AbstractConverter<T>
требует реализации для
public abstract T convert(AbstractEntity e);
Это не проблема, которая extends AbstractConverter
использует сырье потому что переопределенный метод может быть более конкретным в случае возвращаемого объекта (поскольку он все еще относится к типу, описанному родительским классом).
Но проблема возникает, когда в производном классе вы хотите потребовать более конкретного типа в качестве аргумента.
Помните, что производный класс по-прежнему можно использовать из ссылки, которая одного из родителей типа, как можно иметь такой код:
AbstractConverter ac = new CityConverter();
Так что, когда мы будем ссылаться на ac.convert(...)
компилятор позволит использовать любой тип AbstractEntity
как аргумент, не только CityEntity
который мог бы тормозить Код CityConverter#convert
.
Именно поэтому мы не можем объявлять более конкретный тип аргумента метода при его переопределении.
Теперь о вопросе от Вашего названия:
Почему мне нужно бросить в этом случае?
...
CityEntity cityEntity = (CityEntity) entity;
вам нужно литье, потому что entity
объявляется AbstractEntity
, который означает, что есть вероятность того, что передается экземпляр не может быть типа CityEntity
поэтому компилятор не может скомпилировать код, как:
CityEntity cityEntity = entity;//error without cast
Вы можете сказать: «Я уверен, что пройденный экземпляр будет иметь тип (CityEntity)
, а если нет, CastException».
'extends AbstractConverter' не указывает тип генериков. – Andreas