<T>和<?>的區別
<T>是參數類型,常常用於泛型類或泛型方法的定義;<?>是通配符,一般不能直接用來定義類或泛型方法,因為它不能直接參與操作,常常用於泛型方法的調用代碼或泛型方法的型參。
<T>在List、Set、Map中經常見到,用來限制Class中的參數類型,確保Class中參數的一致性。例如:List<String> list = new ArrayList<>();創建了一個內部參數是String類型的類,list中的操作對象都是String。<?>代表任意java類型,只有在不關心數據的具體類型下才使用通配符表示,但在一些情況下,需要將<?>傳入的數據進行強轉,但這樣不如直接傳入<T>。
public class Test1 { public <T> void test1(List<T> list){ System.out.println("== test1 output =="); System.out.println("list length: " + list.size()); // if (!list.isEmpty()) { T t = list.get(0); //list中的元素為T類型 System.out.println("t = " + t);// } } public void test2(List<?> list){ System.out.println("== test2 output =="); System.out.println("list length: " + list.size());// if (!list.isEmpty()) { Object o = list.get(0);//list中的元素為Object System.out.println("o = " + o);// } } }
另外除了<?>,還有<? extends T>上界通配符和<? super T>下界通配符。<? extends T> 表示傳入數據值需要是T類型或T的子類,<? suprt T>表示傳入數據值需要是T類型或T的超類。詳細例子見java泛型知識--博客園
一般來說,<?>主要用於變量上,<T>主要用於類或方法上。下圖中,list的元素類型為?,但往里邊添加String時,會顯示出錯,因為list中的類型是一個未知的java類型,不屬於任何類,所以往里邊添加數據時會出錯。但可以從list中取出數據,取出的數據類型為Object。
其他講解資料: