1

次のコード

public class FilterState<T>{
   Map<String, Object> getProperties(){return null;} // null for shorteness
}

....
public test(FilterState filterState){
    Map<String, Object> map = filterState.getProperties();
}

警告を生成します

Unchecked assignment: 'java.util.Map' to 'java.util.Map<java.lang.String, java.lang.Object>

ただし、プロシージャ定義を次のように置き換えると

public <T> test(IFilterState<T> filterState)

警告が消えます。クラスジェネリックがマップの割り当てと何の関係があるのか​​わかりません。一般的なドキュメントをすばやく検索しても役に立ちませんでした。どこを見ればいいのか、誰か?:)

4

4 に答える 4

5

ジェネリック型引数を破棄すると、クラス全体がraw型を使用するものとして扱われ、そのクラスのすべてのジェネリック型情報は無視されます。それがここで起こっていることです。

于 2012-07-06T13:34:00.913 に答える
1

raw型を使用していると具体化が失敗することを覚えているので、コンパイラーは一般的なプロパティ/メソッドについても自由に文句を言うことができます。しかし、私は間違っているかもしれません。

于 2012-07-06T13:44:08.347 に答える
0

問題が正確に何であるかはわかりませんが、確認したい場所の1つは、仕様のセクション4.8、RawTypesです。

raw型の使用は、レガシーコードの互換性への譲歩としてのみ許可されます。ジェネリックスをJavaプログラミング言語に導入した後に記述されたコードでraw型を使用することは強くお勧めしません。Javaプログラミング言語の将来のバージョンでは、raw型の使用が許可されなくなる可能性があります。型付け規則の潜在的な違反に常にフラグが立てられるようにするために、raw型のメンバーへのアクセスによっては、コンパイル時にチェックされていない警告が発生します。

于 2012-07-06T12:46:41.430 に答える
-1

Class Genericsに従って、定義されたTypeはクラスの動作の一部になるため、ここではメソッドreturn type(Map)GenericにStringがあります。それが私たちがこの警告を受け取る理由だと思います!!! 後の部分で追加したので、それはあなたが使用を余儀なくされているので警告がそこにないことを意味します...

Annotation@suppresswarningを使用して警告を抑制できます

于 2012-07-06T13:26:40.747 に答える