Pergunta

Aqui está o meu código:

Object[] data = GeneComparison.readData(files);
MyGenome genome = (MyGenome) data[0];
LinkedList<Species> breeds = (LinkedList<Species>) data[1];

Ela dá este aviso para o LinkedList:

Type safety: Unchecked cast from Object to LinkedList<Species>

Por que se queixam da lista ligada e não MyGenome?

Foi útil?

Solução

Porque aqui:

MyGenome genome = (MyGenome) data[0];

Você não está usando os genéricos

E aqui

LinkedList<Species> breeds = (LinkedList<Species>) data[1];

Você está usando-los.

Isso é apenas um aviso, você está misturando tipos na matriz de dados. Se você sabe o que você está fazendo (Quer dizer, se o segundo elemento tarefas contém um LinkedList ) você pode ignorar o aviso.

Mas melhor seria ter um objeto como este:

class Anything {
    private Object [] data;
    public Anything( Object [] data ) {
         this.data = data;
    }
    public Gnome getGnome() {
    .....
    }
    public List<Species> getBreeds() {
    ......
    }
 }

E tem que métodos que retornam coisas adequadas, antes de uma conversão correta para que você acabar com:

Anything anything = new Anything( GeneComparison.readData(files) );
MyGenome genome             = anything.getGnome(); // similar to data[0]
LinkedList<Species> breeds = anything.getBreeds(); // similar to data[1];

Dentro desses métodos você tem que fazer transformações adequadas.

Outras dicas

Java reclama assim quando você lançar um tipo não-parametrizado (Object) para um tipo parametrizado (LinkedList). É para dizer-lhe que ele poderia ser qualquer coisa. É realmente diferente para o primeiro elenco, exceto o primeiro irá gerar uma ClassCastException se não é que tipo, mas o segundo não vai.

Tudo se resume ao tipo de rasura. A LinkedList em tempo de execução é realmente apenas uma LinkedList. Você pode colocar qualquer coisa nele e ele não irá gerar uma ClassCastException como o primeiro exemplo.

Muitas vezes, para se livrar de este aviso você tem que fazer algo como:

@SuppressWarning("unchecked")
public List<Something> getAll() {
  return getSqlMapClient.queryForList("queryname");
}

onde queryForList () retorna uma lista (não-parametrizado) onde você sabe que o conteúdo será de Algo classe.

O outro aspecto para isso é que as matrizes em Java são covariant , o que significa que reter informações de tipo de tempo de execução. Por exemplo:

Integer ints[] = new Integer[10];
Object objs[] = ints;
objs[3] = "hello";

lançará uma exceção. Mas:

List<Integer> ints = new ArrayList<Integer>(10);
List<Object> objs = (List<Object>)ints;
objs.add("hello");

é perfeitamente legal.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top