類test
假設有類zi,和類fu,zi 繼承fu.
method(test<? extends fu> test)
而使用super
method(test<? super zi> test)
這是為什麼呢?分析下
先看extends <? extends fu> 為什麼不能set值:
1.當傳入的test物件為test時,t為zi(泛型擦除)
2.如果這時候有乙個新的類zi1繼承fu
2.1.這時候傳入zi1,語法錯誤zi≠zi1
2.2.這時候如果傳入fu,若fu = zi1,依然語法錯誤
總結:當泛型擦除後,你無法確定傳入的值究竟是什麼,這就會引發乙個安全問題。如果對於安全角度考慮,作為編譯器,上面兩種傳值就會有問題。所以此處不能set。
再來看看super <? super zi>為什麼能set zi 而不能set fu
1.當傳入的test物件為test時,t為zi
2.傳zi正常不用說,即使傳入的為test傳zi物件依然安全
3.傳fu為什麼不行呢?和extends同理,如果此時有zi1繼承fu,若fu = zi1,此時將fu傳入依然會有安全問題(型別轉換異常)。
總結:無論是super還是extends,兩者的限定的語法前提下都有乙個目的,就是安全性。所以基於安全性的考慮就有了上面的語法問題。
泛型的extends和super萬用字元
首先定義乙個類 class user public user t t1,t t2 public t gett1 public void sett1 t t1 public t gett2 public void sett2 t t2 有乙個add 方法,引數型別為user public static...
關於泛型,什麼是泛型,如何理解泛型
泛型是jdk5中引入的特性,它提供了編譯時型別安全檢測機制,該機制允許在編譯時檢測到非法的型別,就不至於在執行時出現轉換異常,它的本質是引數化型別 即以任何型別 t 作為引數,在使用時可以傳入型別t的具體值 t 也就是將型別由原來的具體型別用引數t表示 即型別引數化 然後在使用 呼叫時傳入具體的型別...
泛型中extends和super的區別詳解
首先來說 extends t 叫 上界萬用字元 super t 叫 下界萬用字元 1.下面用 來說明上界萬用字元的一些特點 public class fruit public class apple extends fruit public class banana extends fruit pu...