2016-05-13 13 views
0

Gibt die Vererbungsbeziehung parametrisierter generischer Typen nicht genug an, um die Typensicherheit zu gewährleisten? Zum Beispiel:Java Generics extends generiert immer noch ungeprüfte Cast-Warnung

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

Dies generiert immer noch eine Compiler-Warnung. Wenn wir wissen, T extends F, ist es wirklich nicht überprüft?

Antwort

9

Sie Casting und F zu einem T, aber da T extends F, sind Sie ausdrücklich einziehe. Es gibt keine Möglichkeit zu garantieren, dass die in der Methode angegebene F eine T ist. Angenommen, ich dies tun, vorausgesetzt, dass die impliziert Eltern-Kind-Beziehungen gemacht werden:

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

Dies würde brechen, wenn sie ausgeführt, weil ein Fish keine Mammal ist, aber sie paßt Ihren Code.

+0

Danke. Ist es explizit erforderlich, dass das gegebene "F" ein "T" ist, ohne es absichtlich zu überprüfen? –

+1

Verwenden Sie 'T' in Ihrer Deklaration anstatt' F'? – sisyphus

+1

@CannonPalms der einzige Weg zu garantieren, dass 'F' ist ein' T' ist, wenn 'F extendsT' - und dann müssten Sie nicht casten - aber Sie könnten auch einfach' new ArrayList (listOfT) 'auch verwenden , ohne 'ListCastFunction' zu benötigen. –