¿Cómo parametrizo una colección extendida?
-
21-08-2019 - |
Pregunta
He intentado ampliar la clase ArrayList sin mucho éxito.Quiero ampliarlo y poder parametrizarlo.
Entonces normalmente tienes algo como
ArrayList<SomeObject> list = new ArrayList<SomeObject>();
Quiero
MyList<SomeObject> list = new MyList<SomeObject>();
Simplemente extender ArrayList no funciona.
public class MyList extends ArrayList ...
Cuando intento usarlo me sale el error
El tipo MyList no es genérico;No se puede parametrizar con argumentosu003CSomeObject>
He probado variaciones de
public class MyList extends ArrayList<Object>
public class MyList<SubObject> extends ArrayList<Object>
sin éxito, si uso el subobjeto detrás del nombre de la clase, parece funcionar, pero oculta métodos en la clase del subobjeto por alguna razón.
Se agradece cualquier idea o sugerencia sobre cómo hacer que esto funcione correctamente.
Solución
Debe especificar un tipo para el ArrayList
El parámetro de tipo.Para parámetros de tipo genérico, T
es bastante común.Dado que el compilador no sabe qué T
es decir, necesita agregar un parámetro de tipo a MyList
que puede tener el tipo pasado.Así, obtienes:
public class MyList<T> extends ArrayList<T>
Además, es posible que desee considerar implementar List
y delegar en un ArrayList
, en lugar de heredar de ArrayList
."Favorezca la composición de objetos sobre la herencia de clases.[Patrones de diseño pág.20]"
Otros consejos
public class MyList<T>
extends ArrayList<T>
{
}
MyList<SomeObject> list = new MyList<SomeObject>();
o
public class MyList
extends ArrayList<SomeObject>
{
}
MyList list = new MyList();
No debe extenderse ArrayList, se extienden AbstractList lugar:
public class MyList<T> extends AbstractList<T> {
public int size() {...}
public T get(int index) {...}
}