FB18 - Das Forum für Informatik

fb18.de / Off-Topic / Hard- und Softwarefragen

Java: Generics und Varargs

Java: Generics und Varargs 2006-05-30 23:07
UncleOwen
Ich hab eine Hilfsklasse, die mir einige Hilfemethoden fuer Comparator-en definiert:
public class Comparators { public static <T> Comparator<T> chain(final Comparator<? super T>...comparators) { [...] } }
Und eine dazugehoerige Testklasse:
public class ComparatorsTest extends TestCase { private class StringComparator implements Comparator<String> { [...] } private StringComparator comparators[]; public void testChain() { assertTrue(Comparators.chain(comparators[0], comparators[1], comparators[2]).compare("abc", "xyz") < 0); [...] } }
Beim Aufruf von .chain() meldet Eclipse-3.2-RC6 nun aber:
Type safety: A generic array of Comparator<? super String> is created for a varargs parameter

Hmm… Ach? Und was ist daran schlecht? Was sollte man stattdessen machen? Ich koennte natuerlich die Warnungen runterdrehen, aber eigentlich hab ich ganz gerne hohe Warneinstellungen.

Re: Java: Generics und Varargs 2006-05-30 23:47
Zaphod
Was schlägt denn der Quick Fix vor?

Re: Java: Generics und Varargs 2006-05-31 00:37
UncleOwen
Der einzige QuickFix ist "extract to local variable". Damit hab ich dann die gleiche Warnung nur noch einmal statt 14 mal (fuer die anderen assertTrue-s).

Re: Java: Generics und Varargs 2006-05-31 01:01
Fred
Arrays in Java sind nicht typsicher. Viel machen kann man da wohl nicht. (Und Varargs sind hässlich.)

Re: Java: Generics und Varargs 2006-05-31 01:55
leif
Hmmm. Generics sind nicht trivial. Und sie sind in Java anders als in C++.

Ich mutmaße, Du wirst hier vor einer Typunsicherheit gewarnt, die durch die Kombination aus Arrays und Generics entsteht.

Bei Arrays bestimmt der Typ der Zellen ja den Typ des Arrays mit und diese Information bleibt auch noch nach dem Compilieren erhalten. Deswegen gibt es zur Laufzeit einen Fehler, wenn Du einer Zelle ein Objekt unpassenden Types zuweisen willst.

Bei Generics dagegen wird die Information des Typparameters beim Compilieren gelöscht (Erasure), und die JVM kann beim Zuweisen zur Laufzeit gar nicht mehr auf die Einhaltung von Typparametern prüfen. Deswegen kommt es auch erst zur Fehlern, wenn man aus den Generic-Collections ein unpassendes Element ausliest, nicht schon wenn man es reinsteckt.

Dies hat auch zur Folge, dass man keine Arrays von Typparametern erzeugen kann:
public static <T> T[] doesntCompile() { return new T[ 42]; }

Re: Java: Generics und Varargs 2006-05-31 10:36
UncleOwen
Das heisst, er warnt, weil er zur Laufzeit die Typinformationen nicht mehr zur Verfuegung hat? Aber die Typen kann er in diesem Fall doch schon vollstaendig zur Compile-Zeit pruefen; an das Array, was fuer die Varargs erstellt wird, komm ich zur Laufzeit doch gar nicht ran!

Re: Java: Generics und Varargs 2006-05-31 11:25
Anonymer User
Die Eclipse-Warnung entspricht der javac-Warnung "unchecked generic array creation ....". Dieser Fall wird in den Java Generics FAQs unter "Why does the compiler sometimes issue an unchecked warning when I invoke a "varargs" method?" erklärt.

LEIFer

Re: Java: Generics und Varargs 2006-05-31 13:19
UncleOwen
Okay, danke. Jetzt ists (glaub ich) klar.