2017-11-29 2 views
0

私はクラスの中でMultiKeyを使うようにHashMapを変更しています。Apache Collections4のマルチキーを使用すると、チェックされていないコールの意味と解決方法を教えてください。

前:

HashMap<String, MyObject> map = new HashMap<>(); 

今私のキーが2列に依存しますので、私が使用しています:

HashMap<MultiKey, MyObject> map = new HashMap<>(); 
map.put(key(s1,s2),obj); 

private static MultiKey key(String s1, String s2) { 
    return new MultiKey(s1,s2); 
} 

IntelliJのは、以下のMultiKeyにコンストラクタの呼び出しを強調し、私に語りました

Unchecked call to 'MultiKey(K,K)' as a member of raw type 'org.apache.commons.collections4.keyvalue.MultiKey 
Signal places where an unchecked warning is issued by the compiler. 

答えて

2

非生タイプよりも型安全性が低い生タイプが使用されています。

private static MultiKey key(String s1, String s2) { 
    return new MultiKey(s1,s2); 
} 

戻り値の型は生タイプMultiKeyです。そのパラメータ化対応MultiKey<String>にそれを変更してみてください:

private static MultiKey<String> key(String s1, String s2) { 
    return new MultiKey<>(s1,s2); 
} 

また、あなたのマップ定義は、同様に生タイプを使用しています。それは、この場合のマップ変数ではなく具象クラス(HashMap)を宣言するときインターフェース(Map)を使用することをお勧めしますことを注意

Map<MultiKey<String>, Descriptor> map = new HashMap<>(); 

に変更します。

+0

'Map 、MyObject >>'私もこの変更を行いましたが、何が起こるのを防ぐのですか?私はそれについて何の警告も得ていないからです。ありがとう。 – CeePlusPlus

+1

変数が 'Map 'として定義されている場合は、 'MultiKey'をキーとして置くことができます(例えば、' MultiKey ')。後で、 '(String)entry.getKey()。getKey(0)'を使ってそのキーからコンポーネントを抽出しようとすると、それが 'String'であると期待できます。しかし、整数型であるため、実行時にキャストが失敗します。これがコンパイラが警告する理由です。 –

関連する問題