我想知道在Java中專門化泛型類型的選項有什麼選擇,即在模板化類中有特定類型的特定覆蓋。在我的情況下,我是一個泛型類(類型T)通常返回null,但返回「」(空字符串),當T是字符串類型時,或0(零)時,它的整數類型,等Java泛型(模板)專業化可能(覆蓋具有特定類型的模板類型)
僅僅提供的方法的特定類型的過載產生「方法是不明確的」錯誤:
例如:
public class Hacking {
public static void main(String[] args) {
Bar<Integer> barInt = new Bar<Integer>();
Bar<String> barString = new Bar<String>();
// OK, returns null
System.out.println(barInt.get(new Integer(4)));
// ERROR: The method get(String) is ambiguous for the type Bar<String>
System.out.println(barString.get(new String("foo")));
}
public static class Bar<T> {
public T get(T x) {
return null;
}
public String get(String x) {
return "";
}
}
}
是繼承通用類與特定的唯一的選擇類型(請參見以下示例中的StringBar?
public static void main(String[] args) {
Bar<Integer> barInt = new Bar<Integer>();
StringBar barString2 = new StringBar();
// OK, returns null
System.out.println(barInt.get());
// OK, returns ""
System.out.println(barString2.get());
}
public static class Bar<T> {
public T get() {
return null;
}
}
public static class StringBar extends Bar<String> {
public String get() {
return "";
}
}
}
這是唯一的方法,我必須爲每個類型創建一個子類,這是我想要專注的,而不是Bar類中get()的重載。
我猜我可以檢查Bar.get()方法中的instanceof,如果(t的instanceof String)返回「」;否則返回「0」。 if(t instanceof Integer)返回0; 否則返回null; }
不過,我已經被教導避免instanceof,並儘可能使用多態。
注意我來自一個C++的世界裏,C++專業化是通過簡單的方法做重載 – AshirusNW 2010-10-21 13:56:58
Java泛型是從C++模板非常不同,因爲泛型是通過擦除實現的。看看這篇文章,它可能會爲你清理很多:http://stackoverflow.com/questions/313584/what-is-the-concept-of-erasure-in-generics-in-java – 2010-10-21 13:59:17
I知道如何實現差異,但我想知道如何克服Java泛型中的缺陷(特別是專用) – AshirusNW 2010-10-21 14:07:16