2016-05-13 3 views
0

Определяет отношение наследования параметризованных генерических типов недостаточно для обеспечения безопасности типа? Например:Расширение Java Generics по-прежнему генерирует предупреждение без предупреждения

public class ListCastFunction<F, T extends F> implements Function<F, T> { 
    public final T apply(final F from) { 
     return (T) from; 
    } 
} 

Это все еще генерирует предупреждение о компиляторе. Если мы знаем T extends F, разве это действительно не проверено?

ответ

9

Вы литья и F к T, но так как T extends F, вы явно понижающее приведение. Невозможно гарантировать, что F, указанный в методе, равен T. Предположим, что я делаю это, предполагая, что подразумеваемые родитель-потомок сделаны:

ListCastFunction<Animal, Mammal> lcf = new ListCastFunction<>; 
Mammal i = lcf.apply(new Fish()); 

Это нарушило бы при выполнении, так как Fish не Mammal, но он подходит для вашего кода.

+0

Спасибо. Есть ли явно требование, чтобы заданный 'F' был' T' без преднамеренной проверки? –

+1

Используйте 'T' в своей декларации, а не' F'? – sisyphus

+1

@CannonPalms - единственный способ гарантировать, что 'F' является' T', если 'F extends T' - и тогда вам не нужно было бы бросать - но вы также можете просто использовать' new ArrayList (listOfT) 'слишком , без необходимости «ListCastFunction». –

Смежные вопросы