问题描述
考虑到所有问题,共识似乎是问题中提到的StringBar方法是唯一的方法。
public static class StringBar extends Bar<String> {
public String get() {
return "";
}
}
解决方法
我想知道在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 get(T t){if(t instanceof String)返回“”;如果(t
instanceof Integer)返回0; 否则返回null;}
但是,我被教导要避免instanceof,并在可能的情况下使用多态。