Pregunta

Puesto que los medicamentos genéricos se introdujeron, Clase parametrizada, por lo que List.class produce Clase<List>.Esto es claro.

Lo que yo no soy capaz de averiguar es cómo obtener una instancia de la Clase de tipo que es parametrizado a sí mismo, es decir,Clase<List<String>>.Como en este fragmento:

public class GenTest {
    static <T> T instantiate(Class<T> clazz) throws Exception {
        return clazz.newInstance();
    }
    public static void main(String[] args) throws Exception {
        // Is there a way to avoid waring on the line below
        // without using  @SuppressWarnings("unchecked")?
        // ArrayList.class is Class<ArrayList>, but I would like to
        // pass in Class<ArrayList<String>>
        ArrayList<String> l = GenTest.instantiate(ArrayList.class);
    }
}

Me variaciones de este problema muy a menudo y yo todavía no sé, si me olvido de algo, o si realmente no hay mejor manera.Gracias por las sugerencias.

¿Fue útil?

Solución

La Clase es una clase de un tiempo de ejecución de la representación de un tipo.Desde parametrizar los tipos de someterse tipo de borrado en tiempo de ejecución, el objeto de la clase para la Clase sería el mismo que para la Clase<List<Integer>> y Clase<List<String>>.

La razón por la que no puede instanciar ellos con el .notación de clase es que este es un especial de la sintaxis que se utiliza para la clase de literales.El La Especificación Del Lenguaje Java prohíbe expresamente esta sintaxis cuando el tipo está parametrizada, que es la razón por la Lista<String>.la clase no está permitido.

Otros consejos

Las clases representan las clases cargadas por un cargador de clases, que son primas tipos.Para representar un tipo en parámetros, el uso de java.lang.reflejar.ParameterizedType.

No creo que usted puede hacer lo que usted está tratando.En primer lugar, su instanciar método no sabe que su relación con un parametrizar tipo (se podría fácilmente pasar java.util.Date.class).En segundo lugar, porque de la cancelación, haciendo nada en particular específicos con parametrizar los tipos en tiempo de ejecución es difícil o imposible.

Si se va a enfocar el problema de una manera diferente, hay otros pequeños trucos que se pueden hacer, tales como la inferencia de tipos:

public class GenTest
{
    private static <E> List<E> createList()
    {
        return new ArrayList<E>();
    }

    public static void main(String[] args)
    {
        List<String> list = createList();
        List<Integer> list2 = createList();
    }
}

La única cosa que puedes hacer es crear una instancia List<String> directamente y llame a su getClass():

instantiate(new List<String>() { ... }.getClass());

Para los tipos con varios métodos abstractos como List, este es muy torpe.Pero, por desgracia, llamando a la subclase de los constructores (como new ArrayList<String>) o métodos de fábrica (Collections.<String>emptyList()) no funcionan.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top