web-dev-qa-db-ja.com

レガシーライブラリを使用している場合、Javaでunchecked-conversion-warningを回避するにはどうすればよいですか?

Javaのgenerics-featureが好きで、頻繁に使用しています。しかし、genericsをまだ認識していないライブラリを使用すると、問題が発生します。例はサーブレットです。ServletRequest.getParameterMap()結果は生のマップになりますが、キーとしてのStringと値としてのString[]のみが含まれます。そのため、これをMap<String, String[]>に割り当てます。ただし、この割り当ては警告を受け取ります。@SuppressWarningsアノテーションで警告を抑制するだけでなく、言語でこの警告を回避するにはどうすればよいですか。

26
Mnementh

他の人が言ったように、警告はそれらを抑制することを除いて避けられません。 IMHOの問題は、小さいスコープに適用されるアノテーションをコードに散らばるか、グローバルに無視してエラーのリスクを冒す必要があることです。

IIRCには、呼び出しではなく生の型が返される警告を生成する提案があります。

その間、最善の方法は、ラッパーメソッドを使用して、警告が1か所に制限されるようにすることです。警告は無視しても安全です。

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

この回答は、注釈をメソッド本体内に含めることはできないというコメントで編集されました。これは誤りです。上記は構文的に正しいです。変更を元に戻しました。

41

あなたができる最もクリーンなことは、レガシーコードからジェネリックコードへの変換をカプセル化し、そこでのみ警告を抑制することです。

例えば。従来のライブラリに汎用ファサードを配置することもできますが、これは常に価値があるとは限りません。

8
starblue

SuppressWarnings-annotationで警告を抑制するだけでなく、言語でこの警告を回避するにはどうすればよいですか。

注釈is言語による警告を回避する方法。他に方法はありません。

2

このような場合に非表示アノテーションを使用しないようにする方法も見つけようとしていたため、この質問に出くわしました。私は言及する価値があると思った別の選択肢を見つけました:

    Map<?, ?> map = servletRequest.getParameterMap();
    String[] values = (String[]) map.get("key");

基本的にワイルドカード「?」を使用していますマップが任意のタイプのキーと値を持つことができることを示します。

ここで見られる潜在的な欠点は、値のフェッチ中に明示的なキャストを行っていることです。これにより、実行時にパフォーマンスのオーバーヘッドがわずかに発生すると思います。

1
Gaurav

私は同じ問題を抱えていました、私はすべての一般的な警告をオフにしただけで満足しています:)また、多くの人がserialVersionUIDを使用していないため、serialVersionUID警告をオフにすることもできます。

eclipseの場合-Window/Perferences/Java/Compiler/Errors/WarningsとすべてのGenericタイプをオフにします。

追伸悪い警告の多くは、すべての警告を無視しますが、いくつかは有用かもしれません。

1
IAdapter

できないと思います。この警告は、抑制しないか、IDEの警告リストからフィルタリングしない限り表示されます。

1
Rich Seller

他の人が言ったように、この警告を取り除く唯一の方法はそれを抑制することです。

ベストプラクティスは、メソッドとクラスを使用して警告をカプセル化することです。

ただし、他の警告を使用する場合は常に、それらを引き起こしている問題を解決するようにしてください。たとえば、未使用のインポートを削除するなどです。これにより、アプリケーションがよりスリムで優れたものになります。

幸せなコーディング

0
Bardya Momeni