天天看點

Java中泛型Class<T>、T與Class<?>、 Object類和Class類、 object.getClass()和Object.class

一.差別

單獨的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對象的引用。