Generics: Warnung entfernen

Vatar

Erfahrenes Mitglied
Hallo alle zusammen

Code:
List <Vehicle> list;
...
list = sel.toList() // sel = IStructuredSelection

Eclipse bringt mir hier eine Warnung: Type safety: The expression of type List needs unchecked conversion to conform to List<Vehicle>

Wie werde ich diese los?
 
Hallo,

entweder verwendest du die entsprechenden Templates, oder du annotierst die entsprechende Methode mit @SuppressWarnings("unchecked").

Gruß Tom
 
Hallo,

meinte damit, dass du Generics im kompletten Codeverwenden solltest (was natürlich bei der Verwendung von Third-Party Bibliotheken zu weilen recht schwierig ist).Hier kann man aber dann eigene Typsichere Wrapper schreiben das ungetypte Thirdparty API fürs interne API getypted ausschauen lässt.

Ansonsten gibts noch Wildcards (?). Weiterhin kannst du auch anstatt SuppresWarnings("unchecked") direkt zu verwenden, über Bubu.class.cast(...) gehen, was implizit ein SuppressWarnings anwendet.
Java:
/**
 * 
 */
package de.tutorials;

/**
 * @author Tom
 * 
 */
public class GenericExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String s = get(String.class);
    }

    public static <T> T get(Class<T> clazz) {
        // ...
        return clazz.cast(null);
    }
}

Gruß Tom
 
Templates sind sogenannte generische Klassen, die typunabhängig sind. In normalen Klassen ist jedes Element typisiert, d.h. besitzt per Deklaration einen eindeutig vorgegeben Datentyp (und sei es das leere void). In Templates dagegen kann man die Elemente usw. typunabhängig gestalten, d.h. erst zum Zeitpunkt der Instanzierung eines Objekts einer Klasse gibt man an, welchen konkreten Datentyp diese "typlosen" Elemente haben sollen. Man findet das Konzept besonders bei den Klassen der Collections-Serie von Java.

Früher gab es z.B. die Klasse Vector. Die speicherte Objekte und zwar basierend auf der Basisklasse Object. Heute gibt es (seit Java 1.5) das Template Vector<T>, wobei T für den Datentyp steht, den der Vektor aufnehmen soll, also z.B. String oder Integer usw.:

Code:
// Früher

Vector v = new Vector(); // Elementtyp ist beliebig

v.add(new Integer(500)); // Ein Integer Objekt hinzufügen

// Heute

Vector<String> v = new Vector<String>(); // Elementtyp ist Klasse String

v.add(new Integer(500)); // Da meckert Java nun, da Integer != String
Der Compiler warnt dich, weil du die alten Formen und die neuen Formen vermischst. Besser ist es, sich auf eine Form zu beschränken, am besten auf die neue Form.
Allerdings ist das Templates-Konzept von Java recht einfach gehalten und es gibt auch einige fiese Beschränkungen im Gegensatz zu C++ Templates (ich glaube mich zu erinnern, daß (dynamische) Arrays mit Templates als Elementen nicht mit Java funktionieren oder so).
 
Zurück