泛型的上界指定了型別參數必須是某個類別的子類別或實作了某個介面。它的語法形式為 T extends B
,其中T是泛型型別參數,B是上界型別。例如,下面的程式碼展示了一個泛型類別Box
,它的型別參數T必須是Number
或其子類別:
public class Box<T extends Number> { private T value; public Box(T value) { this.value = value; } public T getValue() { return value; } }
在上面的程式碼中,我們使用了extends
關鍵字來指定泛型類型參數的上界類型,這意味著泛型類型參數必須是Number
或其子類別。這樣,我們就可以使用Box
類別來儲存Integer
、Double
、Float
等類型的值,因為它們都是Number
的子類別。另外,透過使用泛型的上界,我們可以確保 Box
類別的實例中只儲存 Number
類型的值,避免了類型轉換異常的風險。
在使用泛型的時候,如果我們傳入一個型別不符合上界限制的參數,則會在編譯時發生錯誤,例如:
Box<String> box = new Box<>("Hello World"); // 编译错误:String 不是 Number 的子类
泛型的下界指定了類型參數必須是某個類別的超類別或是某個介面的實作類別。它的語法形式為 T super B
,其中T是泛型型別參數,B是下界型別。下面是一個範例,展示了一個泛型類別Box
,它的型別參數T必須是Object
或其超類別:
public class Box<T super Object> { private T value; public Box(T value) { this.value = value; } public T getValue() { return value; } }
在上面的程式碼中,我們使用了super
關鍵字來指定泛型類型參數的下界類型,這意味著泛型類型參數必須是Object
或其超類別。這樣,我們就可以使用Box
類別來儲存Object
、String
、Integer
、Double
# 等類型的值,因為它們都是Object
的子類別。另外,透過使用泛型的下界,我們可以確保 Box
類別的實例中儲存的值都是 Object
類型,避免了類型轉換異常的風險。
在使用泛型的時候,如果我們傳入一個型別不符合下界限制的參數,則會在編譯時發生錯誤,例如:
Box<Integer> box = new Box<>(123); // 编译错误:Integer 不是 Object 的超类
有時候,我們需要在泛型中同時使用上界和下界的限制,此時可以使用通配符?
來表示未知類型。例如,下面的程式碼展示了一個泛型方法copy
,它可以將一個陣列的元素複製到另一個陣列中:
public static <T> void copy(List<? extends T> src, List<? super T> dest) { for (T t : src) { dest.add(t); } }
在上面的程式碼中,我們使用了通配符?
來表示未知類型,它可以同時滿足src
參數是T
類型或其子類,dest
參數是 T
類型或其超類別的限制條件。這樣,我們就可以將任意類型的元素複製到另一個清單中了。透過使用上下界通配符,我們可以更靈活地定義泛型方法,同時確保類型安全。
以上是Java泛型的上界和下界通配符怎麼會使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!