Java generics und Arrays-Initialisierung
Was ist die Erklärung für das folgende:
public class GenericsTest {
//statement 1
public ArrayList<Integer>[] lists;
public GenericsTest()
{
//statement 2
lists = new ArrayList<Integer>[4];
}
}
Den compiler akzeptiert Aussage 1. Aussage 2 ist gekennzeichnet durch die compiler für "generic array creation".
Eine gute Erklärung, die ich gesehen habe in Bezug auf das Verbot generische arrays ist diese eine, mit dem argument, dass da arrays sind covariant und Generika sind nicht könnten Sie untergraben die generische Eingabe, wenn Sie erlaubt generische arrays.
Abgesehen von dem Streit, ob die Sprache gehen sollte, um die extremen Längen der Erstellung dieser Art von komplizierten Inkonsistenz in der Behandlung von Generika zu halten Sie vor dem shooting selbst, egal wie hart Sie versuchen (und wenn jemand weiß, jeder gute Diskussionen über die relativen Vorteile/Nachteile der Ausgabe bitte posten, ich wäre interessiert zu sehen, die Argumente), warum sollte die Aussage (1) zulässig, wenn (2) nicht?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint es zu obskuren Fällen, in denen Sie könnten unbeabsichtigt eine classcastexception-Fehler, wie hier beschrieben
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf (Abschnitt 7.3)
eine interessante Diskussion über dieses Thema konnte hier gefunden werden
http://courses.csail.mit.edu/6.170/old-www/2006-Spring/forum/index.php%3Ftopic=324.msg1131.html
Es ist, weil Sie können nicht erstellen, aber Sie können verwenden Sie:
Aussage 3 ist möglich, die Aussage 4 führt zu einem compiler-Fehler.
Also die eigentliche Frage ist: Warum gibt es keine Fehler für die Deklaration eines generischen array? ?
Erhalten Sie immer einen Fehler auf den Punkt, den Sie machen etwas falsch. Hinzufügen eines Fehlers, in denen es nicht technisch ein problem noch hinzu, zu einer Unordnung (obwohl ein editor vielleicht möchten Sie zeigen, dass Sie zu Ihnen).
In einigen Fällen möchten Sie vielleicht auf biegen Sie die Regeln ein wenig mit einer unchecked cast. Es gibt keine Notwendigkeit zu zwingen, den code zu sein, übersät mit mehr Achtung Unterdrückung als notwendig (andere als die auf die Dummheit).
In diesem Fall würde ich vermeiden Sie die Verwendung von arrays aus genau diesem Grund. Die Erklärung von "Listen" in Ihre ursprüngliche code kann
(sollte man das interface verwenden, anstatt die Umsetzung in Variablendeklarationen)
Statt array [] - syntax, verwenden Sie get() oder set(). Andere als das, es ist gleichwertig.