Nach meinem Verständnis ist der Grund, warum es in Java Java-Rohtypen und -Typen gibt, dass es zu der Zeit, als Generika eingeführt wurden, Standard-APIs gab, die nicht generisch gemacht werden konnten, ohne bestehenden Code zu brechen.Warum ist Java (aber nicht .NET) nicht in der Lage, Generics zu verarbeiten, ohne dass ein unformatierter Typ/Typ erforderlich ist?
Generics wurde auch in .NET zu einem späteren Zeitpunkt eingeführt, aber diese Funktion wurde in einer Weise implementiert, die nicht auf unformatierten Typen oder Typenlöschung beruht (und wenn dies der Fall ist) transparent für den Benutzer). Daher wurden vorhandene APIs (z. B. der Code im Namespace System.Collections) und neue generische APIs (z. B. der Code im Namespace System.Collections.Generic) unverändert beibehalten.
Also, warum Java-Generics, im Gegensatz zu .NET-Generics, erfordert rohe Typen/Typ löschen?
Darüber hinaus ersetzte .Net die vorhandenen Container durch generische Versionen in einem anderen Namespace. Code, der sie verwenden möchte, muss auf einmal portiert werden. Java's Art erlaubte ihnen, die existierenden Container einfach generisch zu machen, so dass Porting Bit für Bit nur die gelegentliche Cast- und Warnunterdrückung bedeutet. –
@SebastianRedl: Das ist im Grunde eine Erweiterung von Generics, die nur eine Kompilierzeitfunktion ist. – SLaks
Obwohl .NET die Bytecode-Sprache geändert hat, glaube ich nicht, dass Java dies unbedingt hätte tun müssen, damit generische Objekte ihren Typ erkennen können. Ich würde denken, dass es möglich gewesen wäre, dass jede generische Objektinstanz ein oder mehrere Compiler-generierte Felder enthält, die die Kombination von Typen bezeichnen, mit denen die Instanz instanziiert wurde, und dass der Compiler Code generiert, der solche Felder validiert. Ich denke, ein größeres Problem wäre, dass, wenn eine 'ArrayList' implementiert würde, um irgendein anderer Typ als 'ArrayList' zu sein ... –
supercat