Question

Voici mon code:

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

Il donne cet avertissement pour LinkedList:

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

Pourquoi faut-il se plaindre de la liste chaînée et non MyGenome?

Était-ce utile?

La solution

Car ici:

MyGenome genome = (MyGenome) data[0];

Vous n'utilisez pas génériques

ici

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

Vous les utilisez.

C'est juste un avertissement, vous mixez types dans le tableau de données. Si vous savez ce que vous faites (je veux dire, si le deuxième élément ne contient LinkedList ), vous pouvez ignorer l'avertissement.

Mais mieux serait d'avoir un objet comme celui-ci:

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

Et ont des méthodes appropriées de retour des choses, avant une conversion correcte si vous vous retrouvez avec:

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

Dans ces méthodes que vous avez à faire des transformations appropriées.

Autres conseils

Java se plaint comme ça quand vous lancez un type non-paramétrées (Object) à un type paramétrées (LinkedList). Il est de vous dire que cela pourrait être quelque chose. Il est vraiment pas différente de la première coulée, sauf la première va générer un ClassCastException si ce n'est pas ce type, mais le second ne sera pas.

Tout se résume à un effacement de type. Un LinkedList lors de l'exécution est vraiment juste une LinkedList. Vous pouvez mettre quelque chose en elle et il ne sera pas générer un ClassCastException comme le premier exemple.

Souvent, pour se débarrasser de cet avertissement, vous devez faire quelque chose comme:

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

où queryForList () retourne une liste (non-paramétrés) où vous savez que le contenu sera de quelque chose de classe.

L'autre aspect est que les tableaux en Java sont, ce qui signifie qu'ils conservent des informations de type d'exécution covariant . Par exemple:

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

va lancer une exception. Mais:

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

est parfaitement légal.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top