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