類型原本有:簡單類型和複雜類型,引入泛型後把複雜類型分的更細了;框架
如今List, List 是 兩種不一樣的類型
;且 無繼承
關係;ui
泛型的好處如:spa
開始版本scala
public void write(Integer i, Integer[] ia); public void write(Double d, Double[] da);
泛型版本code
public <T> void write(T t, T[] ta);
簡便了代碼繼承
1.定義在類後面接口
緊跟類名
後面編譯器
public class TestClassDefine<T, S extends T>{}
定義泛型 T, S, 且S 繼承 Tit
2.定義在方法裝飾符
後面io
緊跟修飾符
後面(public)
public <T, S extends T> T testGenericMethodDefine(T t, S s){}
定義泛型 T, S, 且S 繼承 T
定義在類
上的泛型第一聲明類變量
或者實例化時
。例如
List<String> list; list = new ArrayList<String>;
第二繼承類
或者實現接口
時。例如
public class MyList<E> extends ArrayList<E> implements List<E> {...}
定義方法
上的泛型當調用範型方法時,編譯器自動對類型參數(泛型)
進行賦值,當不能成功賦值時報編譯錯誤
上面有泛型的定義
和賦值
;當在賦值
的時候,上面一節說賦值的都是爲具體類型
,當賦值的類型不肯定
的時候,咱們用通配符(?)
代替了:
如
List<?> unknownList; List<? extends Number> unknownNumberList; List<? super Integer> unknownBaseLineIntgerList;
在Java集合框架中,對於參數值是
未知類型
的容器類,只能
讀取其中元素,不能
向其中添加元素, 由於,其類型是未知,因此編譯器沒法識別添加元素的類型和容器的類型是否兼容,惟一的例外是NULL