Dúvida com método clone() e type safety

Com prazer posto a minha primeira dúvida aqui:

/** * @return the kernels */ public ArrayList<String> getKernelsClone() { return (ArrayList<String>) kernels.clone(); }

Acusa “Type safety: Unchecked cast from Object to ArrayList”. Ok, sei do que acontece, mas como faço para parar de dar esse warning? (Orientadamente à objetos falando.)

/**
	 * @return the kernels
	 */
        @SuppressWarnings ("unchecked") 
	public ArrayList<String> getKernelsClone() {
		return (ArrayList<String>) kernels.clone();
	}

[quote=thingol] /** * @return the kernels */ @SuppressWarnings ("unchecked") public ArrayList<String> getKernelsClone() { return (ArrayList<String>) kernels.clone(); } [/quote]

Isso é uma mutreta do Java que só varre para debaixo do tapete o pó,
não tem como fazer isso orientadamente à objetos?

Se você olhar nos fontes do JDK, há essa mutreta em pelo menos um lugar - deve ter mais lugares onde tem essa coisa horrível.

  • Quando se cria um ArrayList<T> a partir de um array, é necessário fazer o cast do array criado para T[], o que é meio porco mesmo.

O problema é que o método “clone” não foi “generificado” (sei lá que palavrão acabei de falar). Então ele continua retornando um Object. O grande problema é que a interface Cloneable é vazia e não tem um método “clone”, como você deve bem saber (argh). O método clone é implementado na classe java.lang.Object - argh. Se a interface Cloneable tivesse um método clone, poderíamos ter algo como:

interface Cloneable<T> {
    T clone();
}
...
class Object implements Cloneable<Object> {
    ...
}
class SeuMaravilhosoEClonavelTO implements Cloneable<SeuMaravilhosoEClonavelTO > {
   ...
}

Ou seja, não tem como fazer isso sem ter de usar o quebra-galho.

Bah, que desilusão! :cry:

hehe

Valeu pela dica!