摘要: [參考](http://blog.csdn.net/jinuxwu/article/details/6771121)
java 泛型中 T 和 問號(通配符)的區別
類型本來有:簡單類型和復雜類型,引入泛型后把復雜類型分的更細了;
-
現在List<Object>, List<String>是
兩種不同的類型
;且無繼承
關系; -
泛型的好處如:
開始版本
public void write(Integer i, Integer[] ia); public void write(Double d, Double[] da);
泛型版本
public <T> void write(T t, T[] ta);
簡便了代碼
定義泛型
-
1.定義在類后面
緊跟
類名
后面public class TestClassDefine<T, S extends 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> extends ArrayList<E> implements List<E> {...}
- 2.實例化
定義方法
上的泛型<br/>
當調用范型方法時,編譯器自動對類型參數(泛型)
進行賦值,當不能成功賦值時報編譯錯誤
通配符(?)
上面有泛型的定義
和賦值
;當在賦值
的時候,上面一節說賦值的都是為具體類型
,當賦值的類型不確定
的時候,我們用通配符(?)
代替了:
如
List<?> unknownList; List<? extends Number> unknownNumberList; List<? super Integer> unknownBaseLineIntgerList;
在Java集合框架中,對於參數值是未知類型
的容器類,只能
讀取其中元素,不能
向其中添加元素, 因為,其類型是未知,所以編譯器無法識別添加元素的類型和容器的類型是否兼容,唯一的例外是NULL
轉自:https://my.oschina.net/jiemachina/blog/201507