【发布时间】:2020-12-04 11:15:50
【问题描述】:
我想知道在 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 并使用多态性。
【问题讨论】:
-
请注意,我来自 C++ 世界,通过方法重载可以轻松实现 C++ 专业化
-
Java 泛型与 C++ 模板有很大不同,因为泛型是通过擦除实现的。看看这个帖子,可能会让你明白很多:stackoverflow.com/questions/313584/…
-
我知道实现的差异,但我想知道如何克服 Java 泛型(特别是专业化)中的缺陷(对于我的用例)