Me pregunto cuáles son las opciones para especializar tipos genéricos en Java, es decir, en una clase de plantilla para tener reemplazos específicos para ciertos tipos.Especialización en genéricos Java (plantilla) posible (reemplazando tipos de plantillas con tipos específicos)
En mi caso, era una clase genérica (de tipo T) para devolver normalmente null, pero devolvía "" (la cadena vacía), cuando T es el tipo String, o 0 (cero) cuando es el tipo Integer, etc.
proporcionar meramente una sobrecarga de tipo específico de un método produce un "método es ambiguo" error:
por ejemplo:
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 "";
}
}
}
es la única opción para subclase de la clase genérica con una específica tipo (ver StringBar en el siguiente ejemplo?
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 "";
}
}
}
Es esta la única manera, es un poco doloroso tener que crear una subclase para cada tipo que quiera especializar en lugar de una sobrecarga de get() en la clase Bar.
Supongo que podría verificar la instancia en el método Bar.get(), p. Ej. T get (T t) { if (t instanceof String) return ""; if (t instanceof Integer) return 0; else return null; }
Sin embargo, me han enseñado a evitar instanceof y usar polimorfismo cuando sea posible.
Nota Vengo de un mundo en el que C++ C++ especialización es simple de hacer a través de método de sobrecarga – AshirusNW
Java genéricos son muy diferentes de las plantillas de C++, ya que los genéricos son ejecutados por el borrado. Eche un vistazo a esta publicación, probablemente aclarará mucho para usted: http://stackoverflow.com/questions/313584/what-is-the-concept-of-erasure-in-generics-in-java –
I Soy consciente de las diferencias en la implementación, pero me pregunto cómo superar las deficiencias (para mi caso de uso) en los genéricos de Java, específicamente la especialización – AshirusNW