簡體   English   中英

Java通用方法聲明基礎

[英]Java generic method declaration fundamentals

我開始學習Java Generics ,並且閱讀了一些教程,但是我有些困惑,不確定如何聲明泛型方法。

當我使用泛型類型時,定義該方法的正確順序是什么? 我找到了此示例,何時需要使用尖括號,什么時候不需要?

public class Box<A> {

    private A a;
    ...

    public void setA(A a) {
        this.a = a;
    }

    public <A> List<A> transform(List<A> in) {
        return null;
    }

    public static <A> A getFirstElement(List<A> list) {
        return null;
    }

    public A getA() {
        return a;
    }

問題是您的代碼使用相同的字符A,但在不同的地方有幾個不同的“含義”:

public class Box<T> { 

需要大括號,因為您在這里說:Box使用通用類型,稱為T。

不帶花括號的T go的用法

private T a;
public void setA(T a) {

但是之后

public <T2> List<T2> transform(List<T2> in) {

正在引入另一個類型參數。 我把它命名為T2,使之清楚,這是一樣的T.的想法是,T2的范圍 僅僅是一個方法transform 其他方法不了解T2!

public static <A> A getFirstElement(List<A> list) {

與上述相同-在此處為“ T3” ;-)

編輯您的評論:您不能使用靜態方法使用類范圍的類型T。這根本不可能! 為什么要在這里查看!

編輯二:泛型允許您編寫泛型的代碼(因為它可以處理不同的類); 但是仍然可以保證編譯時的安全性。 例:

 Box<String> stringBox = new Box<>();
 Box<Integer> integerBox = new Box<>();
 integerBox.add("string"); // gives a COMPILER error!

在人們獲得泛型之前,他們只能在整個地方處理Object 和手動鑄造。

您的示例顯示了兩個不同的概念: 通用類通用方法

這是一個通用類型,引入了類型參數<A>

public class Box<A> {

}

這些是通用方法,它們引入了自己的類型參數<A>

public <A> List<A> transform(List<A> in) {
    return null;
}

public static <A> A getFirstElement(List<A> list) {
    return null;
}

將其與具有特定名稱字段的類和具有該名稱參數的方法進行比較:

public class Box {
    private String name;

    publix Box(String name) {
    }
}

如果您的方法中需要返回類型取決於當時的方法參數,則可以在方法簽名之前寫尖括號,如示例中所示,簡而言之,因為詞暗示Generic用於相同的特征用於多種類型對象的類或實用程序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM