2016-05-13 50 views
0

是否指定參數化泛型的繼承關係不足以確保類型安全性?例如:Java泛型擴展仍然會生成未經檢查的轉換警告

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

你鑄造和FT,但由於T extends F,你明確向下轉換。無法保證該方法中給出的FT。假設我做這個,假設隱含的父子關係是由:

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'。 –

相關問題