2014-05-06 12 views
13

Die Java Guidelines for Wildcard Use sagt:Sollte eine Methode Klasse oder Klasse <?> zurückgeben?

einen Platzhalter als Rückgabetyp verwenden sollten vermieden werden, da es Programmierern mit dem Code zwingt mit Wildcards zu beschäftigen.

Die ObjectgetClass Methode liefert eine Class<?>. Die verschiedenen Methoden in Class akzeptieren eine Class<?> und wenn Sie eine Class übergeben, gibt der Compiler eine ungeprüfte Warnung zurück. Dies führt zu der Annahme, dass immer die Verwendung von Class<?> vorzuziehen ist.

Wenn ich eine Methode habe, die eine Class zurückgibt, und ich weiß nicht, wie dieses Objekt verwendet wird, welchen Typ sollte ich Class oder Class<?> zurückgeben? Warum? Gibt es Szenarien, in denen ich einfach Class zurückgeben möchte?

+3

@CPerkins, wie ich das Zitat verstehe, das Sie zur Verfügung gestellt haben, sprechen sie über die vier oben genannten Aufzählungspunkte. Es folgt eine "Richtlinie" für Rückgabetypen in dem Zitat, das ich in meiner Frage angegeben habe. Es ist nicht nur getClass, sondern auch die ungeprüften Warnungen bei der Verwendung von Klassenmethoden, die dies in Frage stellen. –

Antwort

3

Die Verwendung von MyType<?> ist immer vorzuziehen, wenn ein roher MyType verwendet wird (und dies erstreckt sich auf Class). Die Richtlinien gehen davon aus, dass neuer Code keine Rohtypen verwendet, die nur aus Gründen der Abwärtskompatibilität unterstützt werden. Sie schlagen nicht vor, dass Sie Generika aufgeben, wenn ? das Beste ist, was Sie tun können.

Durch die Verwendung des Platzhalterparameters sind die Sicherheitsgarantien für die Kompilierzeit von Generika immer noch gültig. Diese Garantien existieren nur in der Abwesenheit von Güssen und Rohtypen.

3

Wenn Sie einen generischen Typ zurückgeben möchten, ist die Verwendung eines Platzhalters definitiv vorzuziehen, wenn Sie einen unformatierten Typ verwenden. Wenn Sie rohe Typen in Ihrem Code verwenden, werden alle anderen Sicherheitschecks deaktiviert von der richtigen Verwendung von Generika.

Die Richtlinie sagt Platzhalter sollte vermieden werden, nicht, dass sie müssen nicht verwendet werden. Sie sollten den spezifischsten Typ verwenden, der in einem bestimmten Szenario sinnvoll ist. Dies kann eine konkrete Instanziierung der Typparameter, ein beschränkter extends oder super Platzhalter oder ein unbeschränkter Platzhalter sein, aber jeder von diesen ist eine bessere Wahl als ein unformatierter Typ .

Verwandte Themen