2016-09-14 68 views
1

我開始學習Generics對於Java,我讀了幾個教程,但我有點困惑,不知道如何聲明泛型方法。Java通用方法聲明基礎知識

當我使用泛型類型時,定義該方法的正確順序是什麼?我發現這個示例,何時需要使用尖括號,何時不使用?

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; 
    } 

回答

3

的問題是,你的代碼是使用相同的字符A,但它有幾個不同在不同的地方「的含義」:需要

public class Box<T> { 

括號,因爲你說這裏:箱體採用的是通用型,稱爲T.

用法的T去無括號:

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.那簡直是不可能!請參閱here爲什麼這是!

編輯二:通用允許你寫代碼,通用(因爲它可以處理不同班);但仍然給你編譯時間安全。例如:

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

以前人們有仿製藥,他們只能對付對象所有的地方;和手工鑄造。

+0

好吧,我想我明白它有點bette河但是,我將如何調整靜態方法來返回Box類的T? – Eve

+0

我更新了我的答案以解決您的評論。 – GhostCat

+0

謝謝,你們中的絕大多數:) 最後一個問題,用泛型類型聲明的類有什麼好處,我是否也可以這樣做? public class Box(){ private T t; public Box(T t){ this.t = t; } – Eve

0

如果您的方法中需要返回類型的需求取決於您當前的方法參數,那麼您可以在方法簽名之前寫入尖括號,如示例中所示,簡而言之,爲特徵,其中,以用於多個類型的對象

的需要相同的類或效用
1

你的示例示出了兩個不同的概念:泛型類通用方法

這是一個通用類引入型參數<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) { 
    } 
}