Dynamic Cast (Generics)



  • hi,

    ich habe eine list box, dem ich Objekte von einer Klasse "SoundPlayer<Version>"(Version ist ein enum) hinzufügen kann.
    Wenn ich nun von der Listbox das Obkjekt raushole,

    Sound Player<Version> sPlayer= (Sound Player<Version>)listbox.getItem();

    ist das zwar ok, aber der Compiler meldet mir eine Warnung. Wie kann man das mit dynamic cast lösen oder gibt es vielleicht eine bessere Möglichkeit?



  • Du bekommst diese Warnung weil die den Typ des Generics nicht überprüfst vor dem Casten. Ich bin mir nicht ganz sicher aber versuch vorher mal mittels instanceof den Typ zu verifizieren evtl verschwindet die Warnung dann.
    Ungefähr so:

    if(listbox.getItem() instanceOf Soundplayer<Version>) {
         Sound Player<Version> sPlayer= (Sound Player<Version>)listbox.getItem();
    }
    


  • Tolpan schrieb:

    Du bekommst diese Warnung weil die den Typ des Generics nicht überprüfst vor dem Casten. Ich bin mir nicht ganz sicher aber versuch vorher mal mittels instanceof den Typ zu verifizieren evtl verschwindet die Warnung dann.
    Ungefähr so:

    if(listbox.getItem() instanceOf Soundplayer<Version>) {
         Sound Player<Version> sPlayer= (Sound Player<Version>)listbox.getItem();
    }
    

    Instanceof funktioniert nur mit raw tyes, nicht mit Generics. Die einzige Möglichkeit, die Warnung zu umgehen, ist die SuppressWarnings-Annotation zu verwenden:

    @SuppressWarnings("unchecked")
    	void test() {
    		Object o = new LinkedList<Object>();
    		if (o instanceof List) {
    			((List<Object>) o).get(0);
    		}
    	}
    


  • blöde frage ... aber was nützt dir das feststellen, dass es nicht der richtige typ ist?
    in dem fall wirst du dann wohl eine exception schmeißen, dass was nicht passt ... also das gleiche was auch ohne "instanceof" passieren würde. obwohl, du kannst dir natürliche eine eigene basteln 😛

    einfach nichts zu machen ist vermutlich die schlechteste variante ... in den wenigsten fällen wirst du dir irgendwas aus dem hut zaubern können ö.ä. ... von dem her ist die warnung wohl eher sowas wie "danke das wir darüber geredet haben" ...



  • frager schrieb:

    blöde frage ... aber was nützt dir das feststellen, dass es nicht der richtige typ ist?
    in dem fall wirst du dann wohl eine exception schmeißen, dass was nicht passt ... also das gleiche was auch ohne "instanceof" passieren würde. obwohl, du kannst dir natürliche eine eigene basteln 😛

    einfach nichts zu machen ist vermutlich die schlechteste variante ... in den wenigsten fällen wirst du dir irgendwas aus dem hut zaubern können ö.ä. ... von dem her ist die warnung wohl eher sowas wie "danke das wir darüber geredet haben" ...

    Manchmal muss man je nach übergebenem Typ unterschiedliche Verarbeitungszweige betreten.


Anmelden zum Antworten