Warnung bei cast von generics (array)



  • Zu Übungszwecken bin ich gerade dabei eine Arrayklasse zu schreiben.
    Folgendes Problem dabei (Minimalbeispiel):

    class C<T>
    {
      Object[] array = new Object[1];
    
      public C()
      {
      }
    
      public void set(T t)
      {
        array[0] = t;
      }
    
      public T get()
      {
        return (T) array[0]; // Warnung: Unchecked cast from Object to T
      }
    }
    

    Kann man diese Warnung umgehen? Mach ich etwas falsch oder warum wird an dieser Stelle gewarnt? Was ist üblicherweise der richtige Weg?
    Warum haben nicht auch die Javaimplementationen von Sun das gleiche Problem:

    public E get(int index) {
    	RangeCheck(index);
    
    	return (E) elementData[index];
        }
    

    (Sun Sourcen)

    Für jeden Hinweis / Anregung / Gedanken dankbar 🙂



  • Diese Warnung erhältst du weil du ein Arrayelement von Object castest ohne das sichergestellt ist, dass das Elemente den richtigen Typ hat. Diese Warnung kannst du nicht umgehen wohl aber ignorieren(Ist ja nur ne Warnung kein Fehler). Wenn du sie nicht mehr sehen willst schreib

    @SuppressWarnings("unchecked")
    

    über die Methode

    Warum das bei Sun nicht ist weiß ich nicht.



  • Tolpan schrieb:

    Diese Warnung erhältst du weil du ein Arrayelement von Object castest ohne das sichergestellt ist, dass das Elemente den richtigen Typ hat. Diese Warnung kannst du nicht umgehen wohl aber ignorieren(Ist ja nur ne Warnung kein Fehler). Wenn du sie nicht mehr sehen willst schreib

    @SuppressWarnings("unchecked")
    

    über die Methode

    Warum das bei Sun nicht ist weiß ich nicht.

    Danke für die Antwort.
    Gibt es eine elegantere Lösung für diesen Fehler als ihn zu ignorieren? Sicherstellen, dass die Elemente den richtigen Typen haben ist wohl nicht möglich?



  • Warum kann man nicht einfach

    class C<T>
    {
      T[] array = new T[1];
    

    benutzen?
    Dann müsste man gar nicht casten.



  • Ganz einfach, weil es nicht geht:

    Cannot create a generic array of T
    


  • Oha, das wusste ich nicht. Komme von C++, da geht sowas ohne Probleme. Warum ist das in Java denn eigentlich nicht machbar? Soweit ich weiß geht das doch auch in den .Net Sprachen wie C# besipielsweise.




Anmelden zum Antworten