一、Java泛型介紹
Java泛型是Java SE 5.0版本推出的一個特性,主要是為了解決Java中類型安全問題而產生的。在Java泛型出現之前,通過泛型代碼中使用Object類型可以完成泛型功能,但是這樣做會存在以下問題:
1、代碼複雜,可讀性差,因為使用Object類型的對象需要顯式地執行類型轉換。
// 普通類型對象數組,需要強制類型轉換 Object[] objs = new Object[10]; objs[0] = "hello"; String s = (String) objs[0];
2、容易出現類型不安全的情況,因為在編譯時不會進行類型檢查,只有在運行時才發現問題。
// Object數組漏洞 Object[] objs = new Object[10]; objs[0] = "hello"; objs[1] = 123; String s = (String) objs[1]; // 編譯時無誤,但運行時會拋出ClassCastException異常
因此,Java泛型通過在類、介面、方法等定義中使用類型變數來避免這些問題,從而提高了代碼的可讀性和類型安全性。
// 泛型類型對象數組 T[] array = (T[]) new Object[n]; array[0] = (T) element;
二、泛型類和泛型介面
Java泛型中,類和介面可以定義為泛型類和泛型介面,使用類型變數來表示該類或介面中使用的未知類型。
1. 泛型類
泛型類是指在類聲明時使用類型變數,這些類型變數可以在類的方法、欄位中使用。
public class Pair<T1, T2> { private T1 first; private T2 second; public Pair(T1 first, T2 second) { this.first = first; this.second = second; } public T1 getFirst() { return first; } public void setFirst(T1 first) { this.first = first; } public T2 getSecond() { return second; } public void setSecond(T2 second) { this.second = second; } }
在上面的例子中,Pair類定義了兩個類型變數T1和T2,其中一個表示Pair對象的第一個元素,另一個表示第二個元素,使用泛型類的對象在創建時需要指定T1和T2的具體類型。
Pair<String, Integer> pair = new Pair("hello", 123);
2. 泛型介面
泛型介面是指在介面聲明時使用類型變數,這些類型變數可以在介面的方法、欄位中使用。
public interface Comparator<T> { int compare(T o1, T o2); }
在上面的例子中,Comparator介面定義了一個類型變數T,用於比較對象T o1和T o2的大小。
三、泛型繼承機制
Java泛型中支持泛型繼承,即子類和父類都可以是泛型類,子類在繼承父類時可以保留父類泛型的類型信息。
1. 繼承泛型類
當一個子類繼承一個泛型類時,可以選擇保留父類的泛型類型或指定一個具體的類型。
class SubPair<K> extends Pair { SubPair(String first, K second) { super(first, second); } }
在上面的例子中,SubPair繼承了Pair類,同時使用了K類型變數表示SubPair中的第二個元素,其中第一個元素的類型保留為String類型。
2. 繼承泛型介面
當一個子介面繼承一個泛型介面時,可以選擇保留父介面的類型變數或指定一個具體的類型。
interface MyComparable<T> extends Comparable<T> { boolean equals(T obj); }
在上面的例子中,MyComparable繼承了Comparable介面,同時使用了T類型變數表示MyComparable介面中的比較對象類型,其中equals方法使用了T類型變數。
四、泛型通配符機制
Java泛型中還有一種通配符機制,即?通配符,可以用於表示任意類型。?通配符在定義時不會指定具體類型,但可以在運行時通過限制類型上界和下界來進行類型判斷。
1. 上界通配符
? extends T表示通配符?的類型上界是T,即?可以表示T或T的任意子類。
public static <T extends Comparable<? super T>> T max(List<? extends T> list) { T max = list.get(0); for (T t : list) { if (t.compareTo(max) > 0) { max = t; } } return max; }
在上面的例子中,max方法的List參數使用了? extends T通配符,表示list中的類型是T或T的子類,方法體中通過調用compareTo方法進行對象比較。
2. 下界通配符
? super T表示通配符?的類型下界是T,即?可以表示T或T的任意父類。
public static <T> void copy(List<? super T> dest, List<? extends T> src) { for (int i = 0; i < src.size(); i++) { dest.set(i, src.get(i)); } }
在上面的例子中,copy方法的dest參數使用了? super T通配符,表示dest中的類型是T或T的父類,src參數使用了? extends T通配符,表示src中的類型是T或T的子類,方法體中通過循環將src中的元素複製到dest中。
五、總結
本文主要介紹了Java泛型繼承機制,包括泛型類、泛型介面、泛型繼承和泛型通配符等內容。泛型的出現使得Java程序更加強壯、靈活和可讀性更強,尤其是在涉及到類型轉換和類型檢查時,能夠提供更加優雅和安全的代碼實現方式。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/254546.html