2011-07-16 9 views
10
class pair<U,V>{ 
U first; 
V second; 
public pair() { 
    first = new U(); //error 
    second = new V(); //error 
} 
public pair(U f,V s){ 
    first = f; 
    second = s; 
} 
} 

requerido: Clase
encontrado: parámetro de tipoInicializando la variable. No sé su tipo [java]

¿Es posible inicializar first/second con (sin argumentos) constructor de T/V Tipo de otra manera ?

Respuesta

8

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; 
    } 
} 
+0

¿Puede explicar, cómo puedo pasar al constructor clase , clase ? – RiaD

+0

Publicación editada para reflejar los cambios que se realizarán para la solución general :) –

+1

muchas gracias, funciona – RiaD

1

Nop no se puede, los tipos se borran en Java. Por lo tanto, debe mover la construcción al sitio de llamadas.

+0

sí, gracias. acabo de encontrarlo. :) editaré mi respuesta pronto. – Charith

Cuestiones relacionadas