formaler Parametertyo T



  • Hallo zusammen,

    ich habe folgende Methode, die eine Collection leeren soll und das letzte Element zurückgibt:

    interface Sink<T> {
    	void flush(T t);
    }
    
    static <T> T flushAll(Collection<T> c, Sink <T> sink) {
    	T last = null;
    	for (T t: c) {
    		last = t;	
    		sink.flush(last);
    	}
    	return last;
    }
    
    Sink<Object> sink;
    Collection<String> collection;
    String lastString = flushAll(collection, sink); //Fehler
    

    Ich weiß, dass der Code falsch ist. Das Problem ist, dass <T> kein gültiger Typ ist und daher so keine Zuweisung an "lastString" geschehen kann, weil nicht sichergestellt ist, dass "flushAll" tatsächlich einen String zurückgibt.

    Doch warum eigentlich nicht? Kann Java sich nicht das Argument anschauen? Dessen Typ steht ja vor der Compilierzeit bereits fest. Man sieht doch, dass "collection" vom Typ String ist!

    Vielen Dank für eure Hilfe
    LG, freakC++



  • das problem ist das der compiler bei so sachen "type erasure" macht, also die
    typinformation ausradiert. die laufzeit kann also nicht wissen was da aus
    der collection kommt. du könntest mit "instanceof" prüfen, so wie man das
    vor den typisierten collections machen musste.



  • Natürlich geht das. Bei deinem Code kommt allerdings erstmal ein Fehler, weil du versuchst ein Sink<Object> zu übergeben...


Anmelden zum Antworten