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

泛型方法、泛型類、泛型介面

泛型的幾種正確寫法:

  |--List<String> list = new ArrayList<String>();  ----推薦使用的寫法

  |--List<String> list = new ArrayList(); ---可以使用,但不推薦,是為了相容老版本

  |--List list = new ArrayList<String>(); ---可以使用,但不推薦,是為了相容老版本

 泛型是什麼意思在這就不多說了,而Java中泛型類的定義也比較簡單,例如:public class Test<T>{}。這樣就定義了一個泛型類Test,在例項化該類時,必須指明泛型T的具體型別,例如:Test<Object> t = new Test<Object>();,指明泛型T的型別為Object。

       但是Java中的泛型方法就比較複雜了。

  •        泛型類,是在例項化類的物件時才能確定的型別,這時需要在建立該類的物件時指明泛型的具體型別;
  •    泛型方法,如果讓一個方法可以接收任意的型別,而且呼叫者傳入什麼型別的引數,則該方法的引數型別就是哪一個時,就定義成泛型方法。是在呼叫方法的時候指明泛型的具體型別。

       定義泛型方法語法格式如下:

       呼叫泛型方法語法格式如下:

       說明一下,定義泛型方法時,必須在返回值前邊加一個<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一次,可能不夠靈活;而泛型方法可以在呼叫的時候指明型別,更加靈活。

泛型方法程式碼演示:

複製程式碼
/*程式碼演示*/
package com.cnblogs.test;
public class Generic {
    /**
     * 泛型方法
     * @param <T> 宣告一個泛型T
     * @param c 用來建立泛型物件
     * @return
     * @throws InstantiationException
     * @throws IllegalAccessException
     */
public <T> T getObject(Class<T> c) throws InstantiationException, IllegalAccessException{
        //建立泛型物件
        T t = c.newInstance();
        return t;
    }
}