首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 泛型完整指南:泛型方法、泛型類別、有界型別參數、通配符與上下界詳解

     編輯:Java 程式設計入門

Java 泛型完整指南

泛型(Generics)是 JDK 5 引入的特性,提供編譯期型別安全檢查,本質是參數化型別——將操作的資料型別指定為參數。

需求:寫一個排序方法,能處理整數陣列、字串陣列等任意型別陣列。
解答:使用 Java 泛型撰寫單一方法,編譯器自動適配各型別參數。


泛型方法

宣告規則:

  • 型別參數宣告區塊 <E> 置於回傳型別之前
  • 可包含多個型別參數,逗號分隔
  • 型別參數可作為回傳型別、參數型別佔位符
  • 僅能代表參考型別,不可為基本型別(int、double 等)

泛型方法列印陣列元素

public class GenericMethodTest {
    public static <E> void printArray(E[] inputArray) {
        for (E element : inputArray) System.out.printf("%s ", element);
        System.out.println();
    }
    public static void main(String[] args) {
        Integer[] intArray = {1,2,3,4,5};
        Double[] doubleArray = {1.1,2.2,3.3,4.4};
        Character[] charArray = {'H','E','L','L','O'};
        System.out.println("整型陣列元素:"); printArray(intArray);
        System.out.println("\n雙精度陣列元素:"); printArray(doubleArray);
        System.out.println("\n字元陣列元素:"); printArray(charArray);
    }
}

輸出結果

整型陣列元素: 1 2 3 4 5
雙精度陣列元素: 1.1 2.2 3.3 4.4
字元陣列元素: H E L L O

有界型別參數

限制型別參數範圍,語法:<T extends Comparable<T>>(extends 兼具「繼承類別」與「實作介面」含義)。

回傳三個可比較物件最大值

public class MaximumTest {
    public static <T extends Comparable<T>> T maximum(T x, T y, T z) {
        T max = x;
        if (y.compareTo(max) > 0) max = y;
        if (z.compareTo(max) > 0) max = z;
        return max;
    }
    public static void main(String[] args) {
        System.out.printf("%d, %d, %d 最大為 %d\n", 3,4,5, maximum(3,4,5));
        System.out.printf("%.1f, %.1f, %.1f 最大為 %.1f\n", 6.6,8.8,7.7, maximum(6.6,8.8,7.7));
        System.out.printf("%s, %s, %s 最大為 %s\n", "pear","apple","orange", maximum("pear","apple","orange"));
    }
}

輸出結果

3, 4, 5 最大為 5
6.6, 8.8, 7.7 最大為 8.8
pear, apple, orange 最大為 pear

泛型類別

類別名稱後添加型別參數宣告:class Box<T>。

泛型類別 Box 範例

public class Box<T> {
    private T t;
    public void add(T t) { this.t = t; }
    public T get() { return t; }
    public static void main(String[] args) {
        Box<Integer> intBox = new Box<>();
        Box<String> strBox = new Box<>();
        intBox.add(10);
        strBox.add("菜鳥教程");
        System.out.printf("整型值: %d\n", intBox.get());
        System.out.printf("字串: %s\n", strBox.get());
    }
}

輸出結果

整型值: 10
字串: 菜鳥教程

型別通配符

1. 無界通配符 List<?>

邏輯上為所有 List<具體型別> 的父類型。

public static void getData(List<?> data) { System.out.println("data: " + data.get(0)); }
// 可傳入 List<String>、List<Integer>、List<Number>

2. 上界通配符 List<? extends Number>

僅接受 Number 及其子類型。

public static void getUpperNumber(List<? extends Number> data) { ... }
// List<Integer> ✓, List<Number> ✓, List<String> ✗ (編譯錯誤)

3. 下界通配符 List<? super Number>

接受 Number 及其父類型(如 Object)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved