Como eu parametrizar uma coleção estendida
-
21-08-2019 - |
Pergunta
Eu tenho tentado estender a classe ArrayList sem muito sucesso. Eu quero estendê-lo, e ser capaz de parametrizar-lo.
Então, normalmente você tem algo parecido
ArrayList<SomeObject> list = new ArrayList<SomeObject>();
Eu quero
MyList<SomeObject> list = new MyList<SomeObject>();
Simplesmente estendendo ArrayList não funciona.
public class MyList extends ArrayList ...
O quando tento usá-lo eu recebo o erro
O tipo MyList não é genérico; isto não pode ser parametrizada com argumentos
Eu tentei variações de
public class MyList extends ArrayList<Object>
public class MyList<SubObject> extends ArrayList<Object>
sem sucesso, Se eu usar o sub-objeto por trás do nome da classe que parece trabalho, mas esconde métodos na classe sub-objeto por algum motivo.
Todos os pensamentos ou sugestões sobre como obter esse trabalho direito são apreciados.
Solução
Você precisa especificar um tipo de parâmetro de tipo da ArrayList
. Para parâmetros de tipo genérico, T
é bastante comum. Desde o compilador não sabe o que um T
é, você precisa adicionar um parâmetro de tipo para MyList
que podem ter o tipo passou no Assim, você obtém:.
public class MyList<T> extends ArrayList<T>
Além disso, você pode querer considerar a implementação de List
e delegar a um ArrayList
, ao invés de herdar de ArrayList
. "Composição de objetos Favor sobre herança de classe. [ Design Patterns pg. 20]"
Outras dicas
public class MyList<T>
extends ArrayList<T>
{
}
MyList<SomeObject> list = new MyList<SomeObject>();
ou
public class MyList
extends ArrayList<SomeObject>
{
}
MyList list = new MyList();
Você não deve se estender ArrayList, estender AbstractList vez:
public class MyList<T> extends AbstractList<T> {
public int size() {...}
public T get(int index) {...}
}