web-dev-qa-db-ja.com

これを解決する方法Java型安全性警告?

Map session = ActionContext.getContext().getSession();
session.put("user", user);

このコードは警告を生成します: 型安全性:メソッドput(Object、Object)は、生の型Mapに属しています。ジェネリック型Map <K、V>への参照はパラメーター化する必要があります

Map<String, Serializable> session = (Map<String, Serializable>)ActionContext.getContext().getSession();
session.put("user", user);

このコードは警告を生成します: 型安全性:マップからマップへのチェックされていないキャスト<String、Serializable>

ザ・ getSession メソッドはStruts2に属しているため、変更できません。他の警告が役立つ可能性があるため、@ SuppressWarningsの使用は避けたいと思います。

世界中のすべてのStruts2ユーザーが同じ問題に直面していると思います...エレガントな解決策はありますか?

13
Nicolas Raoul

@SuppressWarnings( "unchecked")以外の方法はないと思います。問題の線のすぐ上に置くことができ、その線を抑制するだけだと思います。

編集:Map<?, ?> session = ActionContext.getContext().getSession();も実行できますが、それを実行する意思があるかどうかはわかりません。その方法でマップに何も入れることはできず(コンパイラーは入れているもののタイプをチェックできないため)、そこから読み取るだけです。

11

これに対処するための最も安全で最も効率的な方法は、おそらく次のとおりです。

Map<?, ?> session = ActionContext.getContext().getSession();

次に、セッションマップから取得したオブジェクトを型キャストします。

@SuppressWarningsアプローチは、実際には同一のコンパイル済みコードになります。ただし、型キャストは暗黙的です。つまり、ソースコードを見ても簡単に見つけることはできません。また、@ SuppressWarningsアノテーションは、(仮想的に)実際のエラーを表す同じコードブロック内の一部のother警告を抑制することができます。つまり、実行時に非表示のタイプキャストなどの1つが失敗する結果になるものです。

他のより高価な代替手段は次のとおりです。

  • Map<?, ?>から新しいMap<String, Serializable>インスタンスへのエントリごとのコピーで、キーと値をそれぞれStringSerializableにキャストするか、

  • タイプキャストを安全に実行する次のような一般的なメソッド。


@SuppressWarnings("unchecked")
public <K,V> Map<K,V> castMap(Map<?, ?> map, Class<K> kClass, Class<V> vClass) {
    for (Map.Entry<?, ?> entry : map.entrySet()) {
        kClass.cast(entry.getKey());
        vClass.cast(entry.getValue());
    }
    return (Map<K,V>) map;
}
5
Stephen C

どのバージョンのStruts2(特にXWork)を使用していますか?私の場合、次のコードでエラーが発生します。

Map<String, Serializable> session = (Map<String, Serializable>)ActionContext.getContext().getSession();
session.put("user", user);

Cannot cast from Map<String,Object> to Map<String,Serializable>.

一方、これは機能し、警告は表示されません。

Map<String, Object> session = ActionContext.getContext().getSession();
1
Tommi

値にパラメーターが必要な場合は、値をパラメーター化するように要求しています。

例えば

Map<Integer, Map> vCombinedCodeMap = new HashMap<>();

「パラメータ化された」Map<Integer, Map>に対して警告を出します。

したがって、正しい形式は次のとおりです。

Map<Integer, Map<String, String>> vCombinedCodeMap = new HashMap<>();
1
user3828314

_@GET_メソッドの先頭に@SuppressWarnings("unchecked")と書くだけです。お役に立てば幸いです。

0
karthik

このようにするとどうなりますか?

Map<String, Serializable> session = ActionContext.getContext().getSession();
0
zed_0xff

次のようにキャストし、

public void setSession(Map<String, Object> sessionMap) {

    // TODO Auto-generated method stub

    this.sessionMap = (SessionMap<String, Object>) sessionMap;
}
0
Satish Shah