Frage

Hier mein Code:

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

Es gibt diese Warnung für den LinkedList:

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

Warum es beschweren sich über die verknüpften Liste und nicht MyGenome?

War es hilfreich?

Lösung

Da hier:

MyGenome genome = (MyGenome) data[0];

Sie sind nicht mit Generika

Und hier

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

Sie sind mit ihnen.

Das ist nur eine Warnung, Sie Typen in dem Datenfeld mischen. Wenn Sie wissen, was Sie tun (ich meine, wenn das zweite Element tun enthält ein LinkedList ) können Sie die Warnung ignorieren können.

Aber besser wäre es, ein Objekt wie diese haben:

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

Und müssen Methoden richtige Dinge zurückkehren, bevor eine korrekte Konvertierung, so dass Sie am Ende mit:

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

Innerhalb dieser Methoden Sie die richtigen Transformationen zu tun haben.

Andere Tipps

Java beklagt sich so, wenn Sie eine nicht parametrisierte Typ umgewandelt (Object) auf eine parametrisierte Typ (LinkedList). Es ist Ihnen zu sagen, dass es etwas sein könnte. Es ist wirklich nicht anders als die erste Besetzung mit Ausnahme der ersten wird eine Classcast erzeugen, wenn es nicht diese Art ist aber die zweite nicht.

Es kommt alles darauf an Typ Löschung. Ein LinkedList zur Laufzeit ist eigentlich nur ein LinkedList. Sie können alles in sie und es wird nicht einen Classcast wie das erste Beispiel erzeugen.

Oft werde diese Warnung befreien Sie so etwas wie zu tun haben:

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

Dabei gilt queryForList () gibt eine Liste (nicht parametrisierte), wo Sie die Inhalte wissen der Klasse etwas sein.

Der andere Aspekt ist, dass Arrays in Java sind covariant , das heißt, sie Laufzeittypinformationen erhalten. Zum Beispiel:

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

wird eine Ausnahme ausgelöst. Aber:

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

ist vollkommen legal.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top