4

安全でない/チェックされていない操作に関する警告が次のように発行されるのはなぜでしょうか。

Map<String, ProxySession> sessionMap = (Map<String, ProxySession>) se.getSession().getServletContext().getAttribute("myattribute");

キャストがおかしい?ここで何が欠けているのか理解できません。

PS警告を取り除きたくありません。安全でない操作を理解したいです。

ありがとう!

4

3 に答える 3

6

これは、キャストが返されたオブジェクトがMap何らかのものであることを確認しますが、型消去のためにその内容については何も確認できないことを意味します。実行時には、マップはマップです...したがって、誰かがMap<Integer, String>代わりにセッションにを入れた場合でも、そのコード行は成功します。エントリの1つを使用しようとした場合にのみエラーが発生します。たとえば、エントリを繰り返し処理し、キーと値を取得します。

Javaジェネリックの奇抜な世界へようこそ:(

于 2011-10-18T10:51:07.457 に答える
1

未チェックのキャストです。プログラマーとしてのあなたは、se.getSession()が<String, ProxySession>パラメーターを使用してその正確な型であることが期待されることを知っているかもしれません。したがって、キャストを実行していますが、その正確な型ではない可能性があります(コンパイラーが提案します)。プログラムでそれをチェックしていないので、コンパイラは警告します。

参照:チェックされていないキャスト警告に対処するにはどうすればよいですか?

于 2011-10-18T10:52:31.477 に答える
0

JVM はこのようなキャストをチェックしません。たとえば、次のように(Map<String, ProxySession>) se.getSession().getServletContext().getAttribute("myattribute");なります(Map) se.getSession().getServletContext().getAttribute("myattribute");

于 2011-10-18T10:58:50.020 に答える