Es ist mal wieder so weit: Type Erasure umgehen!



  • gastantwort schrieb:

    _kermit schrieb:

    gastantwort schrieb:

    T[] meinArray = (T[]) new Object[n];

    Na dann wappne dich mal für die ClassCastExceptions zur Laufzeit.

    Nö, wieso 😕

    Das habe ich bereits so getestet. Für T = String kann ich zwar etwas rein schreiben in den Array, beim Auslesen bekomme ich aber eine Exception. Keine Chance also.

    Ich habe einfach eine Liste von T, aus welcher ich eine bestimmte Anzahl von Elementen in einen Array abfüllen will.

    314159265358979 schrieb:

    Java ist im Prinzip ein Haufen sinnloser Einschränkungen. Damit muss man leben, wenn man es unbedingt verwenden will. 🤡

    Leider muss man auch damit leben, wenn man es verwenden muss 🤡



  • /rant/ schrieb:

    gastantwort schrieb:

    _kermit schrieb:

    gastantwort schrieb:

    T[] meinArray = (T[]) new Object[n];

    Na dann wappne dich mal für die ClassCastExceptions zur Laufzeit.

    Nö, wieso 😕

    Das habe ich bereits so getestet. Für T = String kann ich zwar etwas rein schreiben in den Array, beim Auslesen bekomme ich aber eine Exception. Keine Chance also.

    hä?

    public class Test<T> {
    
    	private T[] arr;
    
    	Test() {
    		this.arr = (T[]) new Object[12];
    	}
    
    	void set(int i, T t) {
    		this.arr[i] = t;
    	}
    
    	T get(int i) {
    		return this.arr[i];
    	}
    
    	public static void main(String[] args) {
    		Test<String> x = new Test<String>();
    		x.set(0, "ololol");
    		String test = x.get(0);
    		System.out.println(test);
    	}
    }
    


  • Ich brauche den Array, nicht ein einzelnes Element. Gib mal den gesamten Array zurück und versuche, auf ein Element zuzugreifen. Siehe da, eine ClassCastException 🙂



  • /rant/ schrieb:

    Ich brauche den Array, nicht ein einzelnes Element. Gib mal den gesamten Array zurück und versuche, auf ein Element zuzugreifen. Siehe da, eine ClassCastException 🙂

    Quatsch, wieso sollte es einen Unterschied machen ob ich in "get" auf das arrray zugreife oder woanders? Du kriegst nur eine exception, wenn du versuchst es in ein String array zu casten, was es ja offensichtlich nicht ist, sondern ein Object array.



  • Eben, aber ich brauche einen String-Array, wenn T für String stehen muss. Darum ist "Quatsch" keine hilfreiche Antwort. Die Exceptions kommen früher oder später.



  • /rant/ schrieb:

    Eben, aber ich brauche einen String-Array

    Dann ist dein Programm eben nicht generisch und ein Grund dein Design zu überdenken.



  • gastantwort schrieb:

    /rant/ schrieb:

    Eben, aber ich brauche einen String-Array

    Dann ist dein Programm eben nicht generisch und ein Grund dein Design zu überdenken.

    Offensichtlich. rant, du hast also eine Liste, in denen Ts drinstehen. Diese möchtest du in einen T-Array packen. Beispielsweise so:

    List<T> values = new ArrayList<T>();
    List<T> filteredValues = new ArrayList<T>();
    
    for(T t : values) {
    	if(/* Dein Kriterium */) {
    		filteredValues.add(t);
    	}
    }
    
    T[] arr = new T[filteredValues.size()];
    filteredValues.toArray(arr);
    

    Oder spricht etwas dagegen?



  • _kermit schrieb:

    Oder spricht etwas dagegen?

    Ja, dass man keine generischen Arrays anlegen kann. Aber das ändert nichts an der Sache dass offenbar irgendwo im Design etwas faul ist, aber dazu haben wir zu wenige Informationen.



  • gastantwort schrieb:

    _kermit schrieb:

    Oder spricht etwas dagegen?

    Ja, dass man keine generischen Arrays anlegen kann. Aber das ändert nichts an der Sache dass offenbar irgendwo im Design etwas faul ist, aber dazu haben wir zu wenige Informationen.

    Stimmt, innerhalb einer Klasse<T> wäre das so nicht möglich.

    Beim Fehler im Design stimme ich dir zu. Warten wir mal Zusatzinfos ab 😉



  • Gibt es irgendeinen Grund keine generischen Klassen aus dem Collection-Framework zu verwenden? Falls du bei irgendeiner API ein Array übergeben musst, dann benutze doch ArrayList und die Methode toArray().

    L. G.
    Steffo



  • List.toArray liefert aber auch nur dann ein T[] zurück, wenn man ein vorkonstruiertes T[] übergibt - selbes Problem.


Anmelden zum Antworten