Я не понимаю, почему компилятор не видит, что литье безопасно, когда параметризованный тип определяется как расширение базового класса. Вот примеры бросков, которые кажутся мне такими, как будто они не должны быть лишними. Кроме того, когда я включаю актерский состав, моя IDE (IntelliJ IDEA) предупреждает, что бросок не отмечен, как будто предполагать, что я делаю что-то неправильно. Есть ли идиома, которая позволяет избежать этих бросков и предупреждений? Почему вообще нужны броски, учитывая, что в заявлении указано, что тип расширяет базовый класс?Почему Java генерирует общие типы?
class Shape {}
class Polygon extends Shape {}
public class Foo<T extends Shape>
{
Set<Polygon> polygons;
// Why must this be cast?
Set<T> shapes = (Set<T>) new HashSet<Polygon>();
T getFirst()
{
// Why must this be cast?
return (T) polygons.iterator().next();
}
Iterable<T> getShapes()
{
// Why must this be cast?
return (Iterable<T>) polygons;
}
}
Улучшенное написание: P –
Я понял это в какой-то момент. Спасибо за лаконичную переподготовку. –