我想知道在 Java 中专门化泛型类型的选项是什么,即在模板类中对某些类型有特定的覆盖。
在我的例子中,我是一个泛型类(T 类型),通常返回 null,但是当 T 是 String 类型时返回“”(空字符串),或者当它是 Integer 类型时返回 0(零)等.
仅提供特定于类型的方法重载会产生“方法不明确”错误:
例如:
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 t) { if (t instanceof String) return ""; if (t instanceof Integer) 返回 0; 否则返回空值; }
但是,我被教导要尽可能避免使用 instanceof 并使用多态性。
最佳答案
综合考虑,一致认为问题中提到的 StringBar 方法是唯一可行的方法。
public static class StringBar extends Bar<String> {
public String get() {
return "";
}
}
关于可能的 Java 泛型(模板)特化(用特定类型覆盖模板类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3988180/