關於泛型的super與extends 的set方法

2021-09-30 01:15:07 字數 682 閱讀 9119

類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...