一.差別
單獨的T 代表一個類型(表現形式是一個類名而已) ,而 Class<T>代表這個類型所對應的類(又可以稱做類執行個體、類類型、位元組碼檔案), Class<?>表示類型不确定的類
Class<T>表示T類型的位元組碼檔案,意思是:
Class<T> 相當于Class<T> c=T.class,T t new T() ;
或者Class<T> c= t.getClass();
通過以上可以擷取類名為c.getName();
解釋:Class<T> ct=T.class,T t new T() ; 與Class c=T.class,T t new T() ;
ct泛型指的是ct隻能是T的位元組碼,而c可以是任何類的位元組碼。是以用ct用法更好
E - Element (在集合中使用,因為集合中存放的是元素)
T - Type(Java 類)
K - Key(鍵)
V - Value(值)
N - Number(數值類型)
? - 表示不确定的java類型
舉例說明:
Set<T> 表示 集合裡 是 T類的執行個體
List<E> 表示 集合裡 是 E類的執行個體
List<?> 表示 集合裡的對象類型不确定,未指定
List 同 List<?> 是一樣的。
泛型的作用: 1、用泛型:
Java代碼 收藏代碼
List<T> list=new ArrayList<T>();
T t=list.get(0); 2、不用泛型:
Java代碼 收藏代碼
List list=new ArrayList();
T t=(T)list.get(0);
二、如何建立一個Class<T>類型的執行個體?
就像使用非泛型代碼一樣,有兩種方式:調用方法 Class.forName() 或者使用類常量X.class。 Class.forName() 被定義為返 回 Class<?>。另一方面,類常量 X.class 被定義為具有類型 Class<X>,所 以 String.class 是Class<String> 類型的。
三、方法中為什麼需要<T> T修飾呢
泛型的聲明,必須在方法的修飾符(public,static,final,abstract等)之後,傳回值聲明之前。
public static <T> T request2Bean(HttpServletRequest request,Class<T> clazz){}
其中第一個<T>是與傳入的參數Class<T>相對應的,相當于傳回值的一個泛型,後面的T是傳回值類型,代表方法必須傳回T類型的(由傳入的Class<T>決定)
四、Object類和Class類
Object類和Class類沒有直接的關系。
Object類是一切java類的父類,對于普通的java類,即便不聲明,也是預設繼承了Object類。典型的,可以使用Object類中的toString()方法。
Class類是用于java反射機制的,一切java類,都有一個對應的Class對象,他是一個final類。Class 類的執行個體表示,正在運作的 Java 應用程式中的類和接口。
平時看代碼時,總是碰到這些即熟悉又陌生的名次,每天都與他們相見,但見面後又似曾沒有任何的交集,是以今天我就來認識下這兩個江湖俠客的背景:
CLASS
在Java中,每個class都有一個相應的Class對象。也就是說,當我們編寫一個類,編譯完成後,在生成的.class檔案中,就會産生一個Class對象,用于表示這個類的類型資訊
擷取Class執行個體的三種方式:
(1)利用對象調用getClass()方法擷取該對象的Class執行個體;
(2)使用Class類的靜态方法forName(),用類的名字擷取一個Class執行個體(staticClass forName(String className) Returns the Classobject associated with the class or interface with the given stringname. );
(3)運用.class的方式來擷取Class執行個體,對于基本資料類型的封裝類,還可以采用.TYPE來擷取相對應的基本資料類型的Class執行個體
在newInstance()調用類中預設的構造方法 ObjectnewInstance()(可在不知該類的名字的時候,常見這個類的執行個體) Creates a new instance of the class represented by this Classobject.
在運作期間,如果我們要産生某個類的對象,Java虛拟機(JVM)會檢查該類型的Class對象是否已被加載。如果沒有被加載,JVM會根據類的名稱找到.class檔案并加載它。一旦某個類型的Class對象已被加載到記憶體,就可以用它來産生該類型的所有對象
Class對象的生成方式如下:
1.Class.forName("類名字元串") (注意:類名字元串必須是全稱,包名+類名);
2.類名.class;
3.執行個體對象.getClass();
五、object.getClass()和Object.class的差別
兩者的差別如下:
類名.class叫做“類字面量”,因class是關鍵字, 是以類名.class編譯時确定。而getclass()是某個具體的方法來調用,是運作時根據實際執行個體确定,getClass()是動态而且是final的。
例如:
String.class 是能對類名的引用取得在記憶體中該類型class對象的引用,而new String().getClass() 是通過執行個體對象取得在記憶體中該實際類型class對象的引用。