2009-07-15 5 views
24

Ich mag das Generika-Feature in Java und benutze es oft. Aber ich habe ein Problem, wenn ich Bibliotheken verwende, die Generika noch nicht kennen. Ein Beispiel sind Servlets. Wenn Sie ServletRequest.getParameterMap() verwenden, wird das Ergebnis eine Raw-Map sein, aber es enthält nur String als Schlüssel und String[] als Werte. Also ich möchte es einem Map<String, String[]> zuweisen. Aber für diese Aufgabe bekomme ich eine Warnung. Wie vermeide ich diese Warnung mit der Sprache, nicht einfach durch die Unterdrückung der Warnung mit der @SuppressWarnings Annotation.Wie kann die ungeprüfte Konvertierungswarnung in Java vermieden werden, wenn Sie Legacy-Bibliotheken verwenden?

Antwort

36

Wie andere gesagt haben, können die Warnungen nicht vermieden werden, außer indem sie unterdrückt werden. Das Problem IMHO ist, dass Sie entweder Ihren Code mit Anmerkungen versehen müssen, die für kleine Bereiche gelten, oder sie global ignorieren und Fehler riskieren.

IIRC gibt es einen Vorschlag, Warnungen zu generieren, wo die unformatierten Typen anstelle des Aufrufs zurückgegeben werden.

Inzwischen denke ich, der beste Ansatz ist eine Wrapper-Methode zu verwenden, so dass die Warnungen auf einen einzelnen Ort begrenzt sind, wo es sicher ist, sie zu ignorieren:

class NoWarn { 
    public static Map<String, String[]> getParameterMap(ServletRequest r) 
    { 
    @SuppressWarnings("unchecked") 
    Map<String, String[]> result = r.getParameterMap(); 
    return result; 
    } 
} 

Hinweis Diese Antwort war bearbeitet mit einem Kommentar, dass Annotationen nicht innerhalb von Methodenkörpern sein können. Das ist falsch, das Obige ist syntaktisch korrekt. Ich habe die Änderung rückgängig gemacht.

+0

Ich hoffe, dass der von Ihnen erwähnte Vorschlag schnell umgesetzt wird (Java7?), Denn das würde mein Problem eindeutig lösen. – Mnementh

1

Ich glaube nicht, dass Sie können. Die Warnung wird angezeigt, es sei denn, Sie unterdrücken sie oder filtern sie aus der Liste Ihrer IDE-Warnungen.

2

Wie kann ich vermeiden, diese Warnung mit der Sprache, nicht einfach durch die Warnung mit der SuppressWarnings-Annotation zu unterdrücken.

Die Anmerkung ist die Art und Weise die Warnung mit der Sprache zu vermeiden. Es geht nicht anders.

8

Die sauberste Sache, die Sie tun können, ist, die Konvertierung von altem zu generischem Code zu kapseln und die Warnung nur dort zu unterdrücken.

z. Sie könnten eine generische Fassade in Ihre Legacy-Bibliothek einfügen, obwohl dies nicht immer lohnenswert ist.

+1

+1 Schreiben Sie einen generischen Wrapper um die Legacy-API und schlagen Sie die Unterdrückungswarnungen auf diese ein. – skaffman

1

Ich hatte das gleiche Problem, ich habe nur alle generischen Warnungen ausgeschaltet und bin glücklich :) Sie könnten auch serialVersionUID Warnung ausschalten, da viele Leute nicht serialVersionUID verwenden.

in Eclipse - Fenster/Perfections/Java/Compiler/Fehler/Warnungen und deaktivieren Sie alle generischen Typen.

P.S. Viele schlechte Warnungen lassen Sie alle Warnungen ignorieren und einige könnten nützlich sein.

+1

Ich benutze Warnungen als eine Möglichkeit zur Verbesserung. Ich bekomme nicht viele Warnungen, weil ich sie alle auf dem Weg repariere. Normalerweise sind die ungeprüften Conversion-Warnungen sehr hilfreich, um Code-Teile zu finden, die verbessert werden können. Aber in diesem Fall sehe ich keinen Weg, ohne diese Warnung zu unterdrücken. – Mnementh

+1

du hast Glück, ich habe jetzt 61 Warnungen im Projekt, sogar unbenutzte Importe warnen. Ich werde es nicht reparieren, da sie nicht in meinem Code sind, also habe ich die Registerkarte "Probleme" geschlossen und suche nur nach gelben Tags in meinem Quellcode. – IAdapter

+0

Ich repariere Warnungen auch im Code anderer im selben Projekt. Wenn Probleme auftreten, besprechen wir die Regeln für die Checker. – Mnementh

0

wie andere sagten, der einzige Weg, um diese Warnung loszuwerden, ist es zu unterdrücken.

Die beste Methode besteht darin, die Warnung mithilfe von Methoden und Klassen zu kapseln.

aber mit anderen Warnungen, versuchen Sie immer, das Problem zu lösen, die sie machen, wie entfernen nicht verwendete Importe und etc ... es macht Ihre Anwendung schlanker und besser.

glücklich Codierung

0

auf diese Frage gestolpert, als ich auch einen Weg, um herauszufinden versuchte, mit der Unterdrückungs-Annotation in solchen Fällen zu vermeiden. Ich fand eine andere Alternative, von der ich dachte, dass sie erwähnenswert war:

Wir verwenden grundsätzlich Wildcard '?' um anzuzeigen, dass die Karte einen beliebigen Schlüssel- und Werttyp haben kann.

Potenzieller Nachteil Ich sehe hier ist, dass wir eine explizite Umwandlung während des Abrufens von Werten machen, was meiner Meinung nach zu einem geringen Leistungsaufwand während der Laufzeit führen wird.