我通常從列表中需要一個項目,有一個簽名的方法:泛型集合沒有
myMethod(T item)
我想用這個方法,但我知道我送的方法。
SpecificItem myItem = new SpecificItem();
myMethod((T) myItem);
這不適合我。這是錯誤代碼的標誌嗎?
我通常從列表中需要一個項目,有一個簽名的方法:泛型集合沒有
myMethod(T item)
我想用這個方法,但我知道我送的方法。
SpecificItem myItem = new SpecificItem();
myMethod((T) myItem);
這不適合我。這是錯誤代碼的標誌嗎?
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
是此實例的通用類型。
(我不知道它在我的後回答您的問題,請發表評論,所以我可以改進它)
你可能會尋找這樣的事情:
class C<? extends T> {
public void myMethod(T myItem) {
...
}
}
可能是更好的辦法將使SpecificItem成爲T的一個子類,或使T成爲一個接口並使SpecificItem實現它。
最好是你的代碼接口。例如:
在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。
哦,我幾乎忘了你的問題。其實這不是一個錯誤的代碼,因爲它的工作原理。我只想告訴你,有一個更好的方法來做到這一點。
您調用該方法的方式看起來很奇怪。如果你已經宣佈你爲
public <T> void myMethod(T item);
編譯器知道,T是一些抽象類型泛型方法,你不應該需要轉換的輸入參數吧。只要確保T沒有在代碼中聲明爲某種特定類型。
UPD:看看這裏的一個例子:http://www.java2s.com/Tutorial/Java/0200__Generics/Usinggenericmethodstoprintarrayofdifferenttypes.htm
這相當於'public void myMethod(Object item);' – user102008 2011-08-31 03:51:03
所以,如果我有 公共接口MyInterface的 { 無效myMethod的(T項目); } 這兩個T的必須匹配? –
Lumpy
2010-08-31 13:40:18
@Lumpy,是的,這就是爲什麼他們都被命名爲「T」。如果你想要多種類型,你可以使用myInterface左右(參見,例如Map) –
2010-08-31 13:42:03
好吧,這很有意義,謝謝 – Lumpy 2010-08-31 13:43:02