Kann nicht markiert Warnungen vermieden werden, wenn ein Verfahren mit rohen Typparametern überschreiben?
-
04-07-2019 - |
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“)?
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
Was aber, wenn die Bibliothek Entwickler gemeint init (Map
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.