Espero que alguien me puede ayudar a salir de esta confusión.Java generics pasando parámetros
Hice este método:
public static <T> void myMethod(Map<Class<T>, MyInterface<T>> map) {
}
parametro utiliza T con el fin de asegurarse de que la clase se utiliza como clave es la misma que la clase se utiliza como parámetro en MyInterface.
Ahora quiero pasar un mapa con las diferentes clases como claves, por supuesto, y las implementaciones correspondientes de MyInterface.
Pero no funciona, obteniendo errores de sintaxis debido a los parámetros de tipo. Aquí está el código, espero que se explique por sí mismo.
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Map<Class<?>, MyInterface<?>> map = new HashMap<Class<?>, MyInterface<?>>();
// Map<Class<Object>, MyInterface<Object>> map = new HashMap<Class<Object>, MyInterface<Object>>();
map.put(Object.class, new MyObjectImpl());
//if I use Map<Class<Object>, MyInterface<Object>> I get a compiler error here
//because map<String> is not map<Object> basically
map.put(String.class, new MyStringImpl());
//this would be possible using <?>, which is exactly what I don't want
// map.put(String.class, new MyIntegerImpl());
//<?> generates anyways a compiler error
myMethod(map);
}
//use T to make sure the class used as key is the same as the class of the parameter "object" in doSomething
public static <T> void myMethod(Map<Class<T>, MyInterface<T>> map) {
}
interface MyInterface<T> {
void doSomething(T object);
}
static class MyObjectImpl implements MyInterface<Object> {
@Override
public void doSomething(Object object) {
System.out.println("MyObjectImpl doSomething");
}
}
static class MyStringImpl implements MyInterface<String> {
@Override
public void doSomething(String object) {
System.out.println("MyStringImpl doSomething");
}
}
static class MyIntegerImpl implements MyInterface<Integer> {
@Override
public void doSomething(Integer object) {
System.out.println("MyIntegerImpl doSomething");
}
}
}
nombres de las clases terminan en 'Impl' suelen ser síntomas de exceso de ingeniería (por ejemplo, implica que sólo hay una implementación de una interfaz dada , que no se puede hacer cumplir). – Romain
Olvídalo, esto no puede funcionar. Los genéricos solo pueden definir un mapa homogéneo.No se puede aplicar nada en cada entrada, solo lo mismo para todas las entradas del mapa. –
@Romain, los nombres reales no son así, solo escríbelos para dar un claro ejemplo. Pero tu comentario podría aplicarse también. ¿Qué quiere decir con que implica solo 1 implementación, tengo 3? – Ixx