1
Map<Date, Integer> m = new HashMap<Date, Integer>(); // line 1
Map<Date, Integer> sMap = new TreeMap(m);            // line 2

2 行目で次のエラーが発生します。

型の安全性: TreeMap 型の式は、Map に準拠するために未チェックの変換が必要です

私が見つけた解決策は次のとおりです。「リスト型の式のチェックされていない変換が必要です...」を修正するにはどうすればよいですか?

しかし、単純に安全です@SuppressWarnings("unchecked")か、それとも私のコードが失敗するシナリオがありますか? より一般的には、いつ安全に ? を追加でき@SuppressWarnings("unchecked")ますか?

4

4 に答える 4

4

インスタンス化するときに TreeMap のジェネリック型を指定してみてください。

Map<Date, Integer> m = new HashMap<Date, Integer>(); // line 1
Map<Date, Integer> sMap = new TreeMap<Date,Integer>(m);

この回答は、java.util.TreeMap を使用していることを前提としています。参照: http://docs.oracle.com/javase/7/docs/api/

于 2012-10-25T09:32:39.487 に答える
2

Java 7 を使用している場合は、ダイヤモンド構文を使用できます。

Map<Date, Integer> m = new HashMap<>();
Map<Date, Integer> sMap = new TreeMap<>(m);
于 2012-10-25T09:35:01.280 に答える
1

正しい方法は次のとおりです。

1. Map<Date, Integer> m = new HashMap<Date, Integer>();
2. Map<Date, Integer> sMap = new TreeMap<Date, Integer>(m);

ジェネリック型について確信がある場合は、「チェックされていない」警告を抑制することもできます。この場合、あなたはそうです。

于 2012-10-25T09:32:49.383 に答える
0

既に述べたように、TreeMap にジェネリック パラメーターを追加すると問題が解決します。これにより、コンパイラーは無効なキャストが発生しないことを保証できるようになります。ジェネリック パラメーターを省略した場合、コンパイラはこの保証を提供できないため、警告が表示されます。次に、正しいタイプのオブジェクトのみを TreeMap に格納するのはユーザーの責任です。

正しいオブジェクトのみが TreeMap に配置されていることが確実な場合は、警告を無視しても問題ありません。それが失敗し、実行時にクラス キャスト例外が発生した場合、それはユーザー自身の責任です (:

一般的に言えば、警告を抑制すると、コードに問題がある可能性があるというコンパイラのヒントを事実上無視していることになります。しかし、コンパイラは愚かで、問題が発生しないと安全に言うことができる状況があります (たとえば、他のチェックが行われているか、エラーが発生しないように設計されているなど)。その場合は、警告を抑制することができます。

于 2012-10-25T09:34:50.373 に答える