¿Crear una instancia de tipo genérico en Java?

Resuelto David Citron asked hace 16 años • 0 respuestas

¿Es posible crear una instancia de tipo genérico en Java? Según lo que he visto, creo que la respuesta es no( debido al borrado de tipo ), pero me interesaría si alguien pudiera ver algo que me falta:

class SomeContainer<E>
{
    E createContents()
    {
        return what???
    }
}

EDITAR: Resulta que los Super Type Tokens podrían usarse para resolver mi problema, pero requiere una gran cantidad de código basado en reflexión, como lo indican algunas de las respuestas a continuación.

Dejaré esto abierto por un tiempo para ver si a alguien se le ocurre algo dramáticamente diferente al artículo Artima de Ian Robertson .

David Citron avatar Sep 17 '08 01:09 David Citron
Aceptado

Estás en lo correcto. No puedes hacerlo new E(). Pero puedes cambiarlo a

private static class SomeContainer<E> {
    E createContents(Class<E> clazz) {
        return clazz.newInstance();
    }
}

Es un dolor. Pero funciona. Envolverlo con el patrón de fábrica lo hace un poco más tolerable.

Justin Rudd avatar Sep 16 '2008 18:09 Justin Rudd

En Java 8 puedes usar la Supplierinterfaz funcional para lograr esto con bastante facilidad:

class SomeContainer<E> {
  private Supplier<E> supplier;

  SomeContainer(Supplier<E> supplier) {
    this.supplier = supplier;
  }

  E createContents() {
    return supplier.get();
  }
}

Construirías esta clase así:

SomeContainer<String> stringContainer = new SomeContainer<>(String::new);

La sintaxis String::newen esa línea es una referencia de constructor .

Si su constructor toma argumentos, puede usar una expresión lambda en su lugar:

SomeContainer<BigInteger> bigIntegerContainer
    = new SomeContainer<>(() -> new BigInteger(1));
Daniel Pryden avatar Mar 30 '2016 16:03 Daniel Pryden