ErickRAR:
Não achei outros..To fora da seleção. :lol:
Desculpe, arrumei o post original. Na questão o parâmetro de entrada é um List e não uma Collection (a Collection, na verdade, é parte da resposta).
Ainda assim, sua correção está errada. Não dá para fazer o cast desse jeito.
Segue o código com as correções comentadas:
public class ListaNaturais
{
private List<Integer> numeros = new ArrayList<Integer>();
public ListaNaturais(Collection<Integer> numeros) {
for (Integer numero : numeros) {
if (numero < 0) throw new IllegalArgumentException("Os números devem ser naturais (>= 0)");
}
//1. É necessário copiar a lista aqui, caso contrário, também dará para inserir números negativos
//Isso também torna possível receber uma collection no lugar da lista
//(desejável, mas não é erro manter a lista).
this.numeros = new ArrayList<Integer>(numeros);
}
public ListaNaturais(int ... numeros) {
for (int numero : numeros) {
//2. Outra opção é mesmo usar esse add.
//Mas isso não pode ser feito a menos que ele seja declarado como final ou private.
//Private não faz sentido nesse caso, então deixamos final.
add(numero);
}
}
public final void add(int numero) {
if (numero < 0)
throw new IllegalArgumentException("O número deve ser natural (>= 0)");
numeros.add(numero);
}
public boolean remove(int numero) {
return numeros.removeAll(numero);
}
public List<Integer> getNumeros() {
//3. Como já foi corrigido, é necessário retornar uma versão não modificável da lista
return Collection.unmodifiableList(numeros);
}
}
Explicação dos problemas 1 e 3:
http://www.guj.com.br/java/104592-heranca#564414
Como inserir objetos inválidos se 1 e 3 não forem corrigidos:
List<Integer> lista = new ArrayList<Integer>();
ListaDeNaturais l = new ListaDeNaturais(lista);
lista.add(-1); //Note que essa instância está compartilhada dentro da lista!
ListaDeNaturais l = new ListaDeNaturais();
l.getNumeros().add(-1); //Retornei um ponteiro para a lista interna, posso chamar o add.
Já o problema 2 refere-se ao fato de que, se o método add não for final, ele estará sujeito a polimorfismo.
Normalmente não seria um problema se o método não estivesse sendo chamado no construtor. E o construtor é o único momento em que a classe pai existe, mas a parte do filho não foi criada ainda (lembre-se, a construção ocorre de cima para baixo).
Portanto, é incorreto chamar métodos polimórficos nesse momento.