1. 程式人生 > >泛型方法

泛型方法

tro 即使 不知道 ack 註意 是不是 ber 這就是 map

(在 類型參數 一節中)您已經看到,通過在類的定義中添加一個形式類型參數列表,可以將類泛型化,不管它們定義在其中的類是不是泛型類在多個方法簽名間實施類型約束。在 List<V> 中,類型參數 V 出現在 get()、add()、contains() 等方法的簽名中。當創建一個 Map<K, V> 類型的變量時,您就在方法之間宣稱一個類型約束。您傳遞給 add() 的值將與 get() 返回的值的類型相同。

類似地,之所以聲明泛型方法,一般是因為您想要在該方法的多個參數之間宣稱一個類型約束。例如,下面代碼中的 ifThenElse() 方法,根據它的第一個參數的布爾值,它將返回第二個或第三個參數:

public <T> T ifThenElse(boolean b, T first, T second) {
return b ? first : second;
}

註意,您可以調用 ifThenElse(),而不用顯式地告訴編譯器,您想要 T 的什麽值。編譯器不必顯式地被告知 T 將具有什麽值;它只知道這些值都必須相同。編譯器允許您調用下面的代碼,因為編譯器可以使用類型推理來推斷出,替代 T 的 String 滿足所有的類型約束:

String s = ifThenElse(b, "a", "b");

類似地,您可以調用:

Integer i = ifThenElse(b, new Integer(1), new Integer(2));

但是,編譯器不允許下面的代碼,因為沒有類型會滿足所需的類型約束:

String s = ifThenElse(b, "pi", new Float(3.14));

為什麽您選擇使用泛型方法是靜態的時,這種情況下不能使用類類型參數。

當 T 上的類型約束對於方法真正是局部的時,這意味著沒有在相同類的另一個 方法簽名中使用相同 類型 T 的約束。通過使得泛型方法 的例子中,類型參數 V 是無約束的或無限制的 類型。有時在還沒有完全指定類型參數時,需要對類型參數指定附加的約束。

考慮例子 Matrix 類,它使用類型參數 V,該參數由 Number 類來限制:

public class Matrix<V extends Number> { ... }

編譯器允許您創建 Matrix<Integer> 或 Matrix<Float> 類型的變量,但是如果您試圖定義 Matrix<String> 類型的變量,則會出現錯誤。類型參數 V 被判斷為由 Number 限制 。在沒有類型限制時,假設類型參數由 Object 限制。這就是為什麽前一屏 泛型方法 中的例子,允許 List.get() 在 List<?> 上調用時返回 Object,即使編譯器不知道類型參數 V 的類型。

泛型方法