2012-06-26 13 views
5

tengo una clase de la siguiente manera:método genérico estática difícil con el tipo de retorno genérica que a su vez podría ser un genérico

public class MyConverter { 
    public <T> T convert (Object o, String typeidentifier, T dummy) 
    { 
     ... do some conversions such as a java array to an ArrayList or vice versa 
     ... based on a typeidentifier syntax similar to Class.getName() but which 
     ... embeds information about generic subtypes 
    } 
} 

y quieren ser capaces de hacer algo general, de esta manera:

int[] ar = {...}; 
ArrayList<Integer> dummy = null; 
Integer elem = MyConverter.convert(ar, "java.util.ArrayList<Integer>", dummy) 
        .get(15); 

Es decir, el T en convertir puede ser una instancia genérica, y encontré que para lograr este objetivo, tengo que pasar un dummy totalmente tipeado, ya que ArrayList.class no le dará al compilador de Java suficiente información de que es un ArrayList<Integer> si usé Class<T> dummycls en lugar de T dummy.

¿Echo de menos algo? ¿Hay alguna forma de escribir e invocar convert sin requerir un dummy?

+2

¿Qué estás tratando de lograr? Parece ser demasiado complicado. – aglassman

+0

¿Quieres hacer algo como 'ArrayList .class'? Puede usar un molde: '(Class >) (Object) ArrayList.class'. Sin embargo, tampoco parece demasiado elegante. –

Respuesta

8

Especifique el tipo de llamada, en lugar de dejar que java infieren del tipo:

Integer elem = MyConverter.<ArrayList<Integer>>convert(ar, "java.util.ArrayList<Integer>"); 

This link describe esta sintaxis (frío).

+0

Esto es exactamente lo que estaba buscando. ¿Dónde está documentado en el sitio de Oracle? –

+0

Agregué un enlace que lo describe. fyi, me encontré con esta sintaxis poco conocida al usar Eclipse para alinear una variable de resultado (que luego eliminó cualquier posibilidad de que java infiera el tipo) y Eclipse insertó el tipo usando esta sintaxis. Innecesario decir, golpeé el oro de los genéricos y lo he usado a menudo desde entonces. Es mucho mejor que pasar una clase * solo * para bloquear el tipo. – Bohemian

3

Este tipo se parece a Arrays.asList, tomará una matriz nativa y la convertirá en una ArrayList.

Una implementación podría recibir lo siguiente:

public static <T> List<T> asList(T... a) { 
    ArrayList<T> arr = new ArrayList<T>(); 
    for (T item: a) { 
     arr.add(item); 
    } 
    return arr; 
} 
+0

Acepto, el método Arrays.asList se parece a lo que desea usar. – aglassman

+0

Estoy haciendo mucho más en mi función de conversión que simplemente las conversiones de ArrayList. Además, las conversiones de HashMap y otras cosas intrincadas. Necesito las otras respuestas, método más general. –

Cuestiones relacionadas