Мне интересно, какие параметры специализируются на общих типах в Java, то есть в шаблоном классе, чтобы иметь определенные переопределения для определенных типов.
В моем случае я был родовым классом (типа T) для возврата null обычно, но возвращаю "" (пустую строку), когда T является типом String или 0 (ноль), когда его тип Integer и т.д..
Простое предоставление перегрузки типа для метода вызывает ошибку "метод является неоднозначной":
например:.
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 "";
}
}
}
Это единственный способ, это немного больно, чтобы создать подкласс для каждого типа, который я хочу специализировать, вместо перегрузки get() в классе Bar.
Я предполагаю, что могу проверить instanceof в методе Bar.get(), например. T get (T t) { if (t instanceof String) return ""; if (t instanceof Integer) возвращает 0; else возвращает null; }
Однако меня научили избегать экземпляра и использовать полиморфизм, когда это возможно.