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...