Warnung bei Generics



  • Hallo zusammen,

    ich hab ne Klasse (Generic) ListLabelRenderer geschrieben,
    die für ein Object den Text zurückgibt. In der Renderer-Klasse rufe
    ich dann diese Methode auf. Jetzt hab ich in der Zeile, wo ich zu meinem
    Generic caste eine Warnung:
    Type safety: The cast from Object to T is actually checking against the
    erased type Object

    public class MyListCellRenderer<T> extends DefaultListCellRenderer {
    
    	public ListLabelRenderer<T> renderer;
    
    	public MyListCellRenderer(ListLabelRenderer<T> renderer) {
    		this.renderer = renderer;
    	}
    
    	public Component getListCellRendererComponent(JList arg0, Object o, int arg2, boolean arg3, boolean arg4) {
    		return super.getListCellRendererComponent(arg0, renderer.getListLabel((T)o) /*HIER*/, arg2, arg3, arg4);
    	}
    
    }
    
    public interface ListLabelRenderer<T> {
    
    	public String getListLabel(T obj);
    
    }
    

    Wie krieg ich die Warnung weg?
    (Ohne eine Methode mit Object-Parameter in der Klasse ListLabelRenderer)
    (oder @SuppressWarnings("unchecked") vor der Methode)

    Gruß,
    Genericer



  • Du musst o bereits als Parameter vom Typ T empfangen. Wenn du nen Object-Parameter frisst, musst du nach T natürlich casten und das kann gar nicht sicher sein für T != Object.



  • Falls du die Signatur nicht ändern kannst, weil du die Methode redefinierst und die Basisklasse nicht ändern kannst, kannst nichts mehr machen. Ist denn DefaultListCellRenderer nicht generisch? Falls doch, dann leite von DefaultListCellRenderer<T> ab.



  • Danke schonmal Optimizer,

    DefaultListCellRenderer ist aber leider kein Generic.

    Dass Object nicht sicher vom Typ T ist, ist mir klar...
    Allerdings kann ich den Parameter nicht vom Typ T empfangen,
    da ich sonst die geforderte Methode nicht mehr implementiere (bei ListCellRenderer), bzw. ich überlade ich die Methode nur mit anderen
    Parametern und sie wird nicht aufgerufen...

    Hat vielleicht noch jemand ne Idee?

    btw: Kann ich dafür sorgen, dass er die Wahnung nur für eine Zeile
    ignoriert und nicht für die gesamte Methode?
    (Sonst muss ich ne Cast-Methode schreiben *g*



  • Dann hast du nur die Möglichkeit, diese Warnung für die ganze Methode auszuschalten.


  • Mod

    Du kannst dir vielleicht ne statische und generische Hilfsmethode schreiben, die du in irgendeiner Hilfsklasse unterbringst und die genau so einen "unsicheren Cast" macht. Die kannst du dann mit @SuppressWarnings markieren.

    Hmmm... die Idee gefällt mir eigentlich sehr gut. Sollte ich vielleicht auch so machen. Es gibt ja einige Stellen, gerade auch in Verbindung mit Reflection, in denen solche "unsicheren Casts" nicht zu vermeiden sind.

    EDIT: Naja, geht wahrscheinlich doch nicht ganz so einfach. 🙄



  • Also ne Cast-Methode *g*

    Was kann mir überhaupt passieren, wenn ich die Warnung ignoriere?
    Im Prinzip, kann meine ClassCastException doch nur erst später
    fliegen und nicht schon an dieser Stelle, oder?



  • Ja, was ja eigentlich auch schlimm genug ist. Beim ersten mal, wenn du o als irgendwas benutzt (ohne den Cast explizit hinzuschreiben) was es nicht ist, z.B. Compareable, kracht es.


Anmelden zum Antworten