java 泛型中 T 和 問號(萬用字元)的區別
阿新 • • 發佈:2018-12-30
型別本來有:簡單型別和複雜型別,引入泛型後把複雜型別分的更細了;
-
現在List<Object>, List<String>是
兩種不同的型別
;且無繼承
關係; -
泛型的好處如:
開始版本
public void write(Integer i, Integer[] ia); public void write(Double d, Double[] da);
泛型版本
public <T> voidwrite(T t, T[] ta);
簡便了程式碼
定義泛型
-
1.定義在類後面
緊跟
類名
後面public classTestClassDefine<T
定義泛型 T, S, 且S 繼承 T
-
2.定義在方法
裝飾符
後面緊跟
修飾符
後面(public)public <T, S extends T> T testGenericMethodDefine(T t, S s){}
定義泛型 T, S, 且S 繼承 T
例項化泛型
- 1.例項化
定義在類
上的泛型
第一宣告類變數
或者例項化時
。例如
List<String> list;
list = new ArrayList<String>;
第二繼承類
或者實現介面
時。例如
public class MyList<E>extendsArrayList<E>implementsList<E> {...}
- 2.例項化
定義方法
上的泛型<br/>
當呼叫範型方法時,編譯器自動對型別引數(泛型)
進行賦值,當不能成功賦值時報編譯錯誤
萬用字元(?)
上面有泛型的定義
和賦值
;當在賦值
的時候,上面一節說賦值的都是為具體型別
,當賦值的型別不確定
的時候,我們用萬用字元(?)
代替了:
如
List<?> unknownList;
List<? extends Number> unknownNumberList;
List<? super Integer> unknownBaseLineIntgerList;
在Java集合框架中,對於引數值是
未知型別
的容器類,只能
讀取其中元素,不能
向其中新增元素, 因為,其型別是未知,所以編譯器無法識別新增元素的型別和容器的型別是否相容,唯一的例外是NULL