一、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-hant/n/254546.html