2010-08-31 104 views
4

我通常從列表中需要一個項目,有一個簽名的方法:泛型集合沒有

myMethod(T item) 

我想用這個方法,但我知道我送的方法。

SpecificItem myItem = new SpecificItem(); 

myMethod((T) myItem); 

這不適合我。這是錯誤代碼的標誌嗎?

回答

9

myMethod在泛型類定義的,有點像:

public class MyClass<T> { 
    T myItem; 

    public void myMethod(T item) { 
     // do Something with item 
    } 

    public T myOtherMethod() { 
     myMethod(myItem); // casting is not necessary 
     return myItem; 
    } 

} 

如果實例化這個類,你有一個實際交換的變量類型T

MyClass<SpecificItem > concreteClass = new MyClass<SpecificItem >(); 

如果你打電話myMethod在此實例中,您必須提供SpecificItem,因爲SpecificItem是此實例的通用類型。

(我不知道它在我的後回答您的問題,請發表評論,所以我可以改進它)

+0

所以,如果我有 公共接口MyInterface的 { 無效myMethod的(T項目); } 這兩個T的必須匹配? – Lumpy 2010-08-31 13:40:18

+2

@Lumpy,是的,這就是爲什麼他們都被命名爲「T」。如果你想要多種類型,你可以使用myInterface 左右(參見,例如Map) – 2010-08-31 13:42:03

+0

好吧,這很有意義,謝謝 – Lumpy 2010-08-31 13:43:02

1

你可能會尋找這樣的事情:

class C<? extends T> { 

    public void myMethod(T myItem) { 
     ... 
    } 

} 
0

可能是更好的辦法將使SpecificItem成爲T的一個子類,或使T成爲一個接口並使SpecificItem實現它。

2

最好是你的代碼接口。例如:

在myMethod的:

<T extends <? super Item>> void (T item); 

這告訴編譯器只接受一個通用類型T中的哪一個項接口/類的實現/推廣。這將確保給定的輸入是正確的類型。編譯器保證它。

在主類:上面給出

Item myItem = new SpecificItem(); 

代碼是最好的做法。習慣它。但是(我不鼓勵這樣)你也可以這樣編碼:

SpecificItem myItem = new SpecificItem(); 

你可以閱讀Java源代碼。例如在類java.util.Collections中。在方法sort(List)中,您可能會注意到Joshua Bloch確保給定的輸入始終格式正確。請試試看:

public class Class1 { 
    public static void main(String[] args) { 
     List<Class1> list = new ArrayList<Class1>(); 

     Collections.sort(list); 
    } 
} 

上面的代碼會產生編譯錯誤。要修復此編譯錯誤,Class1必須實現接口Comparable。這維護了方法sort(List)的前提條件,它假定給定的輸入是一個List of Comparable。

哦,我幾乎忘了你的問題。其實這不是一個錯誤的代碼,因爲它的工作原理。我只想告訴你,有一個更好的方法來做到這一點。

1

您調用該方法的方式看起來很奇怪。如果你已經宣佈你爲

public <T> void myMethod(T item); 

編譯器知道,T是一些抽象類型泛型方法,你不應該需要轉換的輸入參數吧。只要確保T沒有在代碼中聲明爲某種特定類型。

UPD:看看這裏的一個例子:http://www.java2s.com/Tutorial/Java/0200__Generics/Usinggenericmethodstoprintarrayofdifferenttypes.htm

+0

這相當於'public void myMethod(Object item);' – user102008 2011-08-31 03:51:03