1. 程式人生 > >java泛型(泛型介面、泛型類、泛型方法)

java泛型(泛型介面、泛型類、泛型方法)

泛型介面:

定義一個泛型介面:

 

通過類去實現這個泛型介面的時候指定泛型T的具體型別。

指定具體型別為Integer:

指定具體型別為String:

指定具體型別為一個自定義的物件:

泛型類:

在編譯器,是無法知道K和V具體是什麼型別,只有在執行時才會真正根據型別來構造和分配記憶體。

泛型方法:

引用其他人寫的,覺得不錯:

定義泛型方法時,必須在返回值前邊加一個<T>,來宣告這是一個泛型方法,持有一個泛型T,然後才可以用泛型T作為方法的返回值。

       Class<T>的作用就是指明泛型的具體型別,而Class<T>型別的變數c,可以用來建立泛型類的物件。

       為什麼要用變數c來建立物件呢?既然是泛型方法,就代表著我們不知道具體的型別是什麼,也不知道構造方法如何,因此沒有辦法去new一個物件,但可以利用變數c的newInstance方法去建立物件,也就是利用反射建立物件。

       泛型方法要求的引數是Class<T>型別,而Class.forName()方法的返回值也是Class<T>,因此可以用Class.forName()作為引數。其中,forName()方法中的引數是何種型別,返回的Class<T>就是何種型別。在本例中,forName()方法中傳入的是User類的完整路徑,因此返回的是Class<User>型別的物件,因此呼叫泛型方法時,變數c的型別就是Class<User>,因此泛型方法中的泛型T就被指明為User,因此變數obj的型別為User。

       當然,泛型方法不是僅僅可以有一個引數Class<T>,可以根據需要新增其他引數。

       為什麼要使用泛型方法呢?因為泛型類要在例項化的時候就指明型別,如果想換一種型別,不得不重新new一次,可能不夠靈活;而泛型方法可以在呼叫的時候指明型別,更加靈活。

 

 

總結:泛型的使用使我們的程式碼更加具有通用性,不會導致定義了一種型別之後其他的型別都無法使用該程式碼。

   通過泛型可以定義型別安全的資料結構(型別安全)

,而無須使用實際的資料型別(可擴充套件)。這能夠顯著提高效能並得到更高質量的程式碼(高效能),因為您可以重用資料處理演算法,而無須複製型別特定的程式碼(可重用)

 

泛型介面:

定義一個泛型介面:

 

通過類去實現這個泛型介面的時候指定泛型T的具體型別。

指定具體型別為Integer:

指定具體型別為String:

指定具體型別為一個自定義的物件:

泛型類:

在編譯器,是無法知道K和V具體是什麼型別,只有在執行時才會真正根據型別來構造和分配記憶體。

泛型方法:

引用其他人寫的,覺得不錯:

定義泛型方法時,必須在返回值前邊加一個<T>,來宣告這是一個泛型方法,持有一個泛型T,然後才可以用泛型T作為方法的返回值。

       Class<T>的作用就是指明泛型的具體型別,而Class<T>型別的變數c,可以用來建立泛型類的物件。

       為什麼要用變數c來建立物件呢?既然是泛型方法,就代表著我們不知道具體的型別是什麼,也不知道構造方法如何,因此沒有辦法去new一個物件,但可以利用變數c的newInstance方法去建立物件,也就是利用反射建立物件。

       泛型方法要求的引數是Class<T>型別,而Class.forName()方法的返回值也是Class<T>,因此可以用Class.forName()作為引數。其中,forName()方法中的引數是何種型別,返回的Class<T>就是何種型別。在本例中,forName()方法中傳入的是User類的完整路徑,因此返回的是Class<User>型別的物件,因此呼叫泛型方法時,變數c的型別就是Class<User>,因此泛型方法中的泛型T就被指明為User,因此變數obj的型別為User。

       當然,泛型方法不是僅僅可以有一個引數Class<T>,可以根據需要新增其他引數。

       為什麼要使用泛型方法呢?因為泛型類要在例項化的時候就指明型別,如果想換一種型別,不得不重新new一次,可能不夠靈活;而泛型方法可以在呼叫的時候指明型別,更加靈活。

 

 

總結:泛型的使用使我們的程式碼更加具有通用性,不會導致定義了一種型別之後其他的型別都無法使用該程式碼。

   通過泛型可以定義型別安全的資料結構(型別安全),而無須使用實際的資料型別(可擴充套件)。這能夠顯著提高效能並得到更高質量的程式碼(高效能),因為您可以重用資料處理演算法,而無須複製型別特定的程式碼(可重用)