Kann nicht markiert Warnungen vermieden werden, wenn ein Verfahren mit rohen Typparametern überschreiben?

StackOverflow https://stackoverflow.com/questions/241539

Frage

Ich bin erstreckt, um eine Klasse in einer Bibliothek definiert, die ich nicht ändern kann:

public class Parent
{
    public void init(Map properties) { ... }
}

Wenn ich definiere eine Klasse ‚Kind‘, die Eltern erweitert und ich bin mit Java 6 mit Generika, was ist der beste Weg, um die Init-Methode außer Kraft zu setzen, ohne unkontrollierte Warnungen zu bekommen?

public class Child extends Parent
{
    // warning: Map is a raw type. References to generic type Map<K,V> should be parameterized
    public void init(Map properties) { }
}

Wenn ich generische Parameter hinzufügen, erhalte ich:

   // error: The method init(Map<Object,Object>) of type Child has the same erasure as init(Map) of type Parent but does not override it
   public void init(Map<Object,Object>) { ... }
   // same error
   public void init(Map<? extends Object,? extends Object>) { ... }
   // same error
   public void init(Map<?,?>) { ... }

Dieser Fehler tritt unabhängig davon, ob ich eine bestimmte Art zu verwenden, eine beschränkte Wildcard oder eine unbegrenzte Wildcard. Gibt es einen richtigen oder idiomatischen Weg, um eine nicht-generische Methode ohne Warnungen außer Kraft zu setzen, und ohne @SuppressWarnings mit ( „ungeprüft“)?

War es hilfreich?

Lösung

Ja, haben Sie die übergeordnete Methode mit der gleichen Signatur wie in der übergeordneten Klasse zu erklären, ohne dass Generika Informationen hinzufügen.

Ich denke, Ihre beste Wette ist, die @SuppressWarnings("unchecked") Anmerkung zu den raw-Typ-Parametern, nicht die Methode hinzuzufügen, so dass Sie nicht andere Generika-Warnungen squelch Sie in Ihrem eigenen Code haben könnten.

Andere Tipps

Kurze Antwort:. Keine Möglichkeit, das zu tun

Unsatisfying Antwort: Deaktivieren der (spezifischen) Warnungen in Ihrem IDE / build.xml

.

Wenn Sie die Bibliothek nicht ändern, ach, Sie haben mit nicht-generischen Methoden bleiben.

Das Problem ist, dass trotz nach Typ Löschung sowohl init () die gleiche Signatur, können sie in der Tat verschiedene Methoden - oder das gleiche (*). Compiler kann nicht sagen, sollte es überschreiben oder eine Überlastung tun, so ist es verboten.

(*) Angenommen, die Bibliothek Entwickler gemeint init (Map ). Nun setzen Sie init (Map ). Dies wird eine Überlastung und zwei Methoden sollten in der VTable der Kinderklasse vorhanden sein.

Was aber, wenn die Bibliothek Entwickler gemeint init (Map )? Dann ist es überschreibt, und Ihre Methode sollte ersetzen Original init in der Kinderklasse, und es gäbe nur eine Methode in der V-Tabelle des Kindes sein.

P. S. Ich hasse, wie Generics in Java implementiert: - (

Ich denke, oben Antwort gemeint @SuppressWarnings sagen ( "rawtypes") statt.

Sie haben die Methode mit der gleichen Signatur wie die Eltern zu erklären, und deshalb werden Sie Warnungen erhalten, wenn Sie kompilieren. Sie können sie mit @SuppressWarnings ( "ungeprüft") unterdrücken

Der Grund, warum gibt es keine Möglichkeit dies loszuwerden, ist, dass die Warnungen gibt es, damit Sie wissen, dass es möglich Kollektionen mit ungültigen Typen in ihnen zu schaffen. Die Warnungen sollten nur weg, wenn alle Code, die entfernt wurden erlauben könnte. Da man von einer nicht-generischen Klasse erben wird es immer möglich sein, eine Sammlung mit ungültigem Inhalt zu erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top