1. 程式人生 > >java泛型:T與?的使用及區別

java泛型:T與?的使用及區別

T表示泛型,new的時候要加入泛型,更方便通用
? 表示不確定的型別,一般用在通配
Object表示java中所有類的父類,在集合中使用時要格外注意。
jdk為了便於理解,用K表示鍵,V表示值,T表示type型別,E表示enum列舉,其實這四個都只是符號,都是表示泛型名稱。換成其他字母都沒關係,但是都要在之前宣告。

下面介紹一個例子:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

//雖然Test<T1,T2>,但類名字仍為Test。T1,T2只是告訴我們new的時候要加入泛型,更方便通用
//T1,T2可以任意定義,比如改成K,V都可以 //他們不會關聯到其他類,只是在本類中通用 public class Test<T1, T2> { public static void main(String[] args) { System.out.println(new Test().getT1()); System.out.println(new Test().getT2()); new Test<String, String>().getClassName("");//T1,T2在new的時候用到,這裡都為String
new Test().getClassAndList(Integer.class); //HashMap的括號裡面不能是T,E,T1,T2等不確定的東西,但可以是? HashMap<?, ?> map = new HashMap<Object, String>(); List<?> list = new ArrayList<String>(); } public T1 getT1() { //這裡的“T1”替換成1或1.0都會報錯 return
(T1) "T1"; } T2 getT2() { //將自動轉型為String return (T2) "T2"; } public <T> void getClassName(T x) { //<T>必須放在void或者返回型別的前面 System.out.println(x.getClass().getName()); } public <T> Class<?> getClassAndList(Class<?> a) { //Class<T>前面缺少<T>必須定義,否則將出現編譯錯誤 //T改成其他字母都可以,但一定要宣告 // 返回型別和引數中的型別:Class<T>和Class<?>都可以。因為返回的a的型別為Class<T>,Class<?>可以通配 //當兩個都是Class<?>,引數中的?自動通配成T System.out.println(a.getClass().getName());//傳入的a是一個類,Class型別 //引數裡面的Class<T>最大的好處是如果方法裡面定義了泛型,可以自動獲取型別值,比如如下的List<T>可以自動獲取到a的型別,不必強調死 List<?> aa = new ArrayList<T>(); //List<?> aa = new ArrayList<?>();會報錯,以為ArrayList必須是一種型別,List<>起到通配的作用 //List<T> aa = new ArrayList<T>();當然正確 System.out.println(aa); return a; } }