Artikel 23 (Sie rohe Typen nicht in neuem Code verwenden) von Effective Java behaupten, dass rohe Typen in Java-Code verwendet immer gefährlich istSind rohe Typen immer schlecht?
Zum Beispiel behauptet, dass die folgende Methode gefährlich und unsicher ist
// Use of raw type for unknown element type - don't do this!
static int numElementsInCommon(Set s1, Set s2) {
int result = 0;
for (Object o1 : s1)
if (s2.contains(o1))
result++;
return result;
}
Obwohl ich sehen kann, dass jede Art von Schreibvorgang oder Klasse Cast Operation auf s1 und s2 zu allen Arten von Ausnahmen führen kann, verstehe ich nicht, warum die oben genannte Methode unsicher ist. Autor Joshua Bloch fährt fort, stattdessen die folgende Methode zu empfehlen.
// Unbounded wildcard type - typesafe and flexible
static int numElementsInCommon(Set<?> s1, Set<?> s2){
int result = 0;
for (Object o1 : s1)
if (s2.contains(o1))
result++;
return result;
}
Mit anderen Worten, wenn ein Verfahren nur die Methoden der Object.Class verwendet und machen keine Änderungen an den Parametern, die vergangen sind, warum ist es schlecht?
In der Vergangenheit, vor Generika, Menschen würden ** Typen in den Sammlungen des Tages (nämlich 'Hashtable' und' Vector', die zu dieser Zeit keine Sammlungen waren) ** mischen. Das führte zu Dingen wie '[0," abc ", Date]', was ein Hack ist (weil Java dir erlaubt, deine eigenen Datentypen zu erstellen). Mit 'Set >' haben Sie garantiert einen konsistenten Elementtyp. –
Sicher. Meine Frage ist, sind raw-Typ unsicher im Fall von schreibgeschützten Methoden oder Operationen, die nur Methoden von ** Object.Class ** –
ausgesetzt sind Nein, sie sind nicht. Zur Laufzeit sind alle Typen unformatiert, und sie tun genau dasselbe wie die empfohlene Methode mit den Platzhaltern. Aber diese Methode lässt den Compiler überprüfen, dass Sie nichts anderes tun als diese "sicheren Dinge". Ohne die Joker-Karte erhalten Sie keinen Fehler, wenn Sie beispielsweise versehentlich zu Ihrem Set hinzufügen. Verwenden Sie also entweder den generischen Typ, wenn Sie ihn kennen, oder den Platzhalter, wenn Sie es nicht wissen. Verwenden Sie keine Rohtypen. – Thilo