12.2 定義簡單的泛型類
1)文檔目錄:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAnYldHL0FWby9mZvwFN4ETMfdHLkVGepZ2XtxSZ6l2clJ3LcV2Zh1Wa9M3clN2byBXLzN3btgHL9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsQTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SMzATOxUzN2MTN1QmY1IWNzYzX5IDNzITM4IzLcBTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
2)代碼:
Pair.java
package com.test1;
//泛型類generic class 就是具有一個或者多個類型變量的類
public class Pair<T> {
private T first;
private T second;
//構造器
public Pair(){
first = null;
second = null;
}
public Pair(T first,T second){
this.first = first;
this.second = second;
}
//通路器
public T getFirst() {
return first;
}
public T getSecond() {
return second;
}
//修改器
public void setFirst(T first) {
this.first = first;
}
public void setSecond(T second) {
this.second = second;
}
}
PairTest1.java
package com.test1;
public class PairTest1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//String [] words = { "mary","had","a","little","lamb"};
//大寫字母的字典序排在小寫的後面
String [] words = { "Mary","had","a","little","lamb"};
Pair<String> mm = ArrayAlg.minmax(words);
System.out.println("min: "+mm.getFirst());
System.out.println("max: "+mm.getSecond());
}
}
class ArrayAlg{
public static Pair<String> minmax(String[] a){
if(a == null || a.length == 0) return null;
String min = a[0];
String max = a[0];
//O(n) 複雜度求最大值最小值
for(int i = 1;i<a.length;i++){
if(min.compareTo(a[i]) > 0) min = a[i];
if(max.compareTo(a[i]) < 0) max = a[i];
}
//這個T可加可不加,因為建立過程中 參數類型已經确認,并且他就是個代号
return new Pair<String>(min,max);
}
}
12.4 類型變量的限定
這裡直接貼 PairTest2.java的代碼
package com.test1;
import java.util.Calendar;
import java.util.GregorianCalendar;
/**
* 這裡的泛型類依然是Pair
* 傳入泛型類中的類型變量是GregorianCalendar類
* 此類已經實作Comparable接口進行日期的比較
* @author PeersLee
*
*/
public class PairTest2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
GregorianCalendar[] birthdays = {
new GregorianCalendar(1900,Calendar.DECEMBER,9),
new GregorianCalendar(1815,Calendar.DECEMBER,10),
new GregorianCalendar(1903,Calendar.DECEMBER,3),
new GregorianCalendar(1910,Calendar.DECEMBER,22),
};
Pair<GregorianCalendar> mm = ArrayAlg.minmax(birthdays);
System.out.println("min: "+mm.getFirst().getTime());
System.out.println("max: "+mm.getSecond().getTime());
}
}
class ArrayAlg{
/**對類型變量進行限制
* 可以通過對類型變量設定限定實作這 确信T所屬的類一sing有compareTo方法
* 将T限制限制為實作了Comparable接口(隻含有compareTo的标準接口)
*/
public static <T extends Comparable> Pair<T> minmax(T[] a){
//T的綁定類型可以是類,也可以是接口,選擇 extends 的原因是更接近于子類的概念
//可以有多個綁定 例如 T extends Comparable & Serializable 中間用 ‘&’分格
if(a == null || a.length == 0) return null;
T min = a[0];
T max = a[0];
for(int i = 1;i<a.length;i++){
if(min.compareTo(a[i])>0) min = a[i];
if(max.compareTo(a[i])<0) max = a[i];
}
return new Pair<>(min,max);
}
}
12.5 泛型代碼和虛拟機
- 虛拟機中沒有泛型,隻有普通的類和方法。
- 所有的類型參數都用他們的限定類型替換。
- 橋方法被合成來保持多态。
- 為保持類型安全性,必要時插入強制類型轉換