首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 泛型方法與類泛型參數的區別:為什麼 push 方法不需要 ?

     編輯:程式設計疑難解答

核心結論

類已經聲明了泛型參數 <E>,成員方法直接使用類級泛型參數即可,無需也不允許在方法上再次聲明 <E>。

代碼對比

❌ 錯誤寫法 (重複聲明)

public class GenericStack<E> {
    // ...
    public <E> void push(E e) { // 編譯錯誤:方法級  隱藏了類級 ,導致類型混淆
        list.add(e);
    }
}

✅ 正確寫法 (直接使用類級泛型)

public class GenericStack<E> { // 類聲明泛型參數 E
    private ArrayList<E> list = new ArrayList<>();
    
    public void push(E e) { // 直接使用類級 E,無需 
        list.add(e);
    }
    
    public E pop() { // 返回類級 E
        // ...
    }
}

什麼時候需要「泛型方法」(方法級聲明 )?

**當方法需要的類型參數與類的泛型參數無關,或類本身不是泛型類時。**

場景 1:工具類靜態方法 (類非泛型)


public class CollectionUtils { // 非泛型類
    // 方法自己聲明類型參數 T
    public static <T> List<T> newArrayList() {
        return new ArrayList<T>();
    }
    
    public static <T> void swap(List<T> list, int i, int j) {
        T tmp = list.get(i);
        list.set(i, list.get(j));
        list.set(j, tmp);
    }
}

場景 2:泛型類中,方法需要「額外」的類型參數


public class Box<T> { // 類泛型 T
    private T content;
    
    // 方法需要新類型參數 U,與類的 T 無關
    public <U> Box<U> transform(Function<T, U> mapper) {
        return new Box<>(mapper.apply(content));
    }
}

判斷規則速查表

情況方法聲明示例
類有泛型 <E>,方法用同一個 E無 <E>,直接用 Epublic void push(E e)
類無泛型,方法需泛型需 <T>public static <T> List<T> emptyList()
類有 <T>,方法需**另一個**類型 U需 <U>public <U> Box<U> map(Function<T,U> f)
構造函數**無** <T>,直接用類級參數public GenericStack() (或 public GenericStack(int cap))

總結

類級泛型參數是類的「屬性」,成員方法天然可見並共享。 push(E e) 中的 E 直接引用類定義的 <E>,**不需要也不應該**在方法前加 <E>。只有當方法需要**獨立於類**的類型參數時,才在方法修飾符後聲明 <T>,這才叫「泛型方法」。

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