Java normalmente no permite esto debido a type erasure. Puede especificar argumentos de constructor del tipo Class<U>
y Class<V>
, para los cuales pasará en tipos de clase concretos de los parámetros de tipo dados (es decir, Integer.class
y String.class
para <Integer>
y <String>
).
También es posible extraer el tipo utilizando el reflejo del nivel de bytecode, pero bastante complicado, y no siempre funciona en todas las situaciones. Si se desplaza hacia abajo en this article, puede encontrar el ejemplo que hace esto posible. Lo he pegado a continuación para mayor comodidad.
static public Type getType(final Class<?> klass, final int pos) {
// obtain anonymous, if any, class for 'this' instance
final Type superclass = klass.getGenericSuperclass();
// test if an anonymous class was employed during the call
if (!(superclass instanceof Class)) {
throw new RuntimeException("This instance should belong to an anonymous class");
}
// obtain RTTI of all generic parameters
final Type[] types = ((ParameterizedType) superclass).getActualTypeArguments();
// test if enough generic parameters were passed
if (pos < types.length) {
throw RuntimeException(String.format("Could not find generic parameter #%d because only %d parameters were passed", pos, types.length));
}
// return the type descriptor of the requested generic parameter
return types[pos];
}
Editar: para la respuesta al comentario:
class pair<U,V>{
U first;
V second;
public pair(Class<U> cu, Class<V> cv) {
try {
first = cu.newInstance();
second = cv.newInstance();
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
public pair(U f,V s){
first = f;
second = s;
}
}
¿Puede explicar, cómo puedo pasar al constructor clase , clase? –
RiaD
Publicación editada para reflejar los cambios que se realizarán para la solución general :) –
muchas gracias, funciona – RiaD