Zuerst wird, wie Sie bemerkt haben, ist die Besetzung nicht notwendig. Ohne die Besetzung erhältst du eine ungeprüfte Conversion-Warnung (während du bei der Besetzung eine ungeprüfte Cast-Warnung erhältst). Die Konvertierung zwischen einem Rohtyp und einem parametrisierten Typ kann ohne explizite Umwandlung erfolgen (Sie erhalten nur eine Warnung).
Wenn Sie fragen, warum es nicht möglich ist, ein Array eines parametrisierten Typs direkt zu erstellen, liegt das daran, dass Arrays in Java garantieren, dass sie zur Laufzeit niemals ein Element enthalten, das keine Instanz des Komponententyp, mit dem das Array erstellt wurde. d.h., jedes Mal, wenn etwas in das Array gegeben wird, wird eine Laufzeitprüfung durchgeführt, um zu überprüfen, ob es sich um eine Instanz des Komponententyps des Arrays handelt.
Wie Sie vielleicht wissen, generische Typargumente gibt es nicht bei der Kompilierung, und es ist nicht möglich instanceof
einen parametrisierte Typen zur Laufzeit zu überprüfen. Es ist nur möglich, die bestätigten Typen instanceof
zu überprüfen. Wenn ein Array mit einem parametrisierten Typ erstellt werden könnte, wäre es nicht in der Lage, seinen Kontrakt zu erfüllen, um zu überprüfen, ob alles, was zur Laufzeit eingegeben wird, eine Instanz dieses Typs ist. Jemand, der sich auf diese Garantie von Arrays verlässt, wird unerwartete Ergebnisse erhalten. Daher wird es Ihnen nicht erlauben, es zu tun. Das Erstellen eines Arrays mit einem Rohtyp (was Sie getan haben) oder mit einem Platzhalter-parametrisierten Typ ist jedoch in Ordnung, da es sich um verdinglichte Typen handelt. Obwohl Sie es als Array eines parametrisierten Typs verwenden, haben Sie dies durch eine ungeprüfte Konvertierung (mit einer Warnung) getan, so dass Sie die Verantwortung für eventuell auftretende Sicherheitsprobleme übernehmen.
Verwenden Sie Java 8? Einige Dinge sind mit seinem Generikasystem besser geworden. – Makoto