Java 限定傳入的兩個泛型參數的類型相同
定義一個泛型方法,同時限制傳入的兩個泛型參數的類型要相同,整理了一下思路。
1、定義泛型方法
Java 定義泛型方法的格式大致如下:
/**
* 泛型方法
* @param a 泛型參數a
* @param b 泛型參數b
* @param <T> 聲明此方法持有一個類型T,也可以理解為聲明此方法為泛型方法
* @return 此方法的返回值為類型T
*/
public static <T> T test(T a, T b) {
return a;
}
現在要限定泛型參數 a 與 泛型參數 b 傳入的類型相同,怎么辦呢?
2、超類型限定
既然要限定泛型參數 a 與 b 的類型相同,那么可不可以讓 b 作為 a 的子類去實現類型限定呢?
思路如下:
1、聲明 參數 a 的類型,直接讓 a 繼承泛型 T就可以了。
//聲明參數a的類型為S,S繼承於T
public static <T, S extends T> T test(S a, T b) {
return a;
}
2、聲明參數 b 的類型, 繼承 Comparable<a>
的類型。 Comparable 是一個泛型接口,實現類必須都重寫 compareTo() 方法,因此可以用來限定 b 的類型只能是 a 的 類型,即超類型限定。(如果參數只是包裝類,到這里就可以了)
public static void main(String[] args) {
//包裝類、當兩個參數的類型不同,直接報錯
test(1, 2);
}
public static <T, S extends T, W extends Comparable<S>> T test(S a, W b) {
return a;
}
3、傳入的是實體類型參數,必須重寫 compareTo() 方法 ,因為上文的包裝類都默認實現了 compareTo()
方法。
如 User 實體類:
public static void main(String[] args) {
//實體類型,必須重寫compareTo()方法
User user1 = new User();
User user2 = new User();
test(user1, user2);
}
public static <T, S extends T, W extends Comparable<S>> T test(S a, W b) {
return a;
}
到這里,就限定了傳入的兩個泛型參數的類型必須一致,否則報錯。