Pregunta

Aquí está mi código:

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

Se da esta advertencia para el LinkedList:

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

¿Por qué se quejan de la lista enlazada y no MyGenome?

¿Fue útil?

Solución

Porque aquí:

MyGenome genome = (MyGenome) data[0];

No está utilizando genéricos

Y aquí

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

Se está utilizando.

Eso es sólo una advertencia, que son tipos de mezcla en la matriz de datos. Si sabes lo que estás haciendo (es decir, si el segundo elemento de hacerlo contiene un LinkedList ) puede pasar por alto la advertencia.

Pero mejor sería tener un objeto como éste:

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

Y que los métodos que vuelven las cosas adecuadas, antes de una conversión correcta por lo que terminan con:

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 de los métodos que tiene que hacer transformaciones adecuadas.

Otros consejos

Java se queja de que al igual que cuando lanzas un tipo no parametrizado (Objeto) a un tipo parametrizado (LinkedList). Es a decir que podría ser cualquier cosa. Es realmente no es diferente a la primera fundido, excepto el primero, generará un ClassCastException si no es ese tipo, pero el segundo no lo hará.

Todo se reduce al tipo de borrado. Un LinkedList en tiempo de ejecución es en realidad una LinkedList. Usted puede poner cualquier cosa en él y no va a generar un ClassCastException como el primer ejemplo.

A menudo, para deshacerse de esta advertencia que tiene que hacer algo como:

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

donde queryForList () devuelve una lista (no parametrizada) donde se sabe que los contenidos serán de clase algo.

El otro aspecto de esto es que las matrices en Java son covariante , lo que significa que retienen información de tipo en tiempo de ejecución. Por ejemplo:

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

lanzará una excepción. Pero:

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

es perfectamente legal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top