Я не понимаю, почему компилятор не может видеть, что приведение является безопасным, когда параметризованный тип определен как расширение базового класса.Вот примеры бросков, которые кажутся мне ненужными.Кроме того, когда я включаю приведение, моя IDE (IntelliJ IDEA) предупреждает, что приведение не проверено, как будто я предполагаю, что я делаю что-то не так.Есть ли идиома, которая избегает этих заблуждений и предупреждений?Зачем нужны приведения, если в объявлении указано, что тип расширяет базовый класс?
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;
}
}