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ユーザーが同じ問題に直面していると思います...エレガントな解決策はありますか?
@SuppressWarnings( "unchecked")以外の方法はないと思います。問題の線のすぐ上に置くことができ、その線を抑制するだけだと思います。
編集:Map<?, ?> session = ActionContext.getContext().getSession();
も実行できますが、それを実行する意思があるかどうかはわかりません。その方法でマップに何も入れることはできず(コンパイラーは入れているもののタイプをチェックできないため)、そこから読み取るだけです。
これに対処するための最も安全で最も効率的な方法は、おそらく次のとおりです。
Map<?, ?> session = ActionContext.getContext().getSession();
次に、セッションマップから取得したオブジェクトを型キャストします。
@SuppressWarningsアプローチは、実際には同一のコンパイル済みコードになります。ただし、型キャストは暗黙的です。つまり、ソースコードを見ても簡単に見つけることはできません。また、@ SuppressWarningsアノテーションは、(仮想的に)実際のエラーを表す同じコードブロック内の一部のother警告を抑制することができます。つまり、実行時に非表示のタイプキャストなどの1つが失敗する結果になるものです。
他のより高価な代替手段は次のとおりです。
Map<?, ?>
から新しいMap<String, Serializable>
インスタンスへのエントリごとのコピーで、キーと値をそれぞれString
とSerializable
にキャストするか、
タイプキャストを安全に実行する次のような一般的なメソッド。
@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;
}
どのバージョンの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();
値にパラメーターが必要な場合は、値をパラメーター化するように要求しています。
例えば
Map<Integer, Map> vCombinedCodeMap = new HashMap<>();
「パラメータ化された」Map<Integer, Map>
に対して警告を出します。
したがって、正しい形式は次のとおりです。
Map<Integer, Map<String, String>> vCombinedCodeMap = new HashMap<>();
_@GET
_メソッドの先頭に@SuppressWarnings("unchecked")
と書くだけです。お役に立てば幸いです。
このようにするとどうなりますか?
Map<String, Serializable> session = ActionContext.getContext().getSession();
次のようにキャストし、
public void setSession(Map<String, Object> sessionMap) {
// TODO Auto-generated method stub
this.sessionMap = (SessionMap<String, Object>) sessionMap;
}