1. 程式人生 > 實用技巧 >Java中泛型Class<T>、T與Class<?>、 Object類和Class類、 object.getClass()和Object.class

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()呼叫類中預設的構造方法 Object.newInstance()(可在不知該類的名字的時候,常見這個類的例項) 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物件的引用。

本文轉載,原文連結

Java中泛型Class<T>、T與Class<?>、 Object類和Class類、 object.getClass()和Object.class - zhaoyanhao - 部落格園 https://www.cnblogs.com/zhaoyanhaoBlog/p/9362267.html