¿Crear una instancia de tipo genérico en Java?
¿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 .
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.
En Java 8 puedes usar la Supplier
interfaz 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::new
en 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));