Tengo una clase de plantilla de la siguiente manera:
class MyClass<T>
{
T field;
public void myMethod()
{
field = new T(); // gives compiler error
}
}
¿Cómo creo una nueva instancia de T en mi clase?
java
generics
reflection
Mercurioso
fuente
fuente
Supplier
se encuentra? `MyClass (Class <? Extiende T> impl)` debe declarar `throws NoSuchMethodException` para ser compilado. Desafortunadamente, su respuesta no es amigable para los principiantes de Java.java.util.function.Supplier
Otro enfoque no reflexivo es utilizar un patrón híbrido Builder / Abstract Factory.
En Effective Java, Joshua Bloch repasa el patrón Builder en detalle y aboga por una interfaz Builder genérica:
public interface Builder<T> { public T build(); }
Los constructores de hormigón pueden implementar esta interfaz, y las clases externas pueden utilizar el constructor de hormigón para configurar el Constructor según sea necesario. El constructor se puede pasar a MyClass como
Builder<T>
.Con este patrón, puede obtener nuevas instancias de
T
, incluso siT
tiene parámetros de constructor o requiere configuración adicional. Por supuesto, necesitará alguna forma de pasar el Constructor a MyClass. Si no puede pasar nada a MyClass, entonces Builder y Abstract Factory están fuera.fuente
Esto puede ser más pesado de lo que está buscando, pero también funcionará. Tenga en cuenta que si adopta este enfoque, tendría más sentido inyectar la fábrica en MyClass cuando se construye en lugar de pasarla a su método cada vez que se llama.
interface MyFactory<T> { T newObject(); } class MyClass<T> { T field; public void myMethod(MyFactory<T> factory) { field = factory.newObject() } }
fuente
Si está dispuesto a realizar una subclase, también puede evitar el borrado, consulte http://www.artima.com/weblogs/viewpost.jsp?thread=208860
fuente
Clase classOfT
try { t = classOfT.newInstance();//new T(); NOTE: type parameter T cannot be instantiated directly } catch (Exception e) { e.printStackTrace(); }
fuente