0

バックグラウンド

Map値でソートできる を作成します。

問題

コードは期待どおりに実行されますが、正常にコンパイルされません。

http://pastebin.com/bWhbHQmT

public class SortableValueMap<K, V> extends LinkedHashMap<K, V> {
  ...
  public void sortByValue() {
      ...
      Collections.sort( list, new Comparator<Map.Entry>() {
          public int compare( Map.Entry entry1, Map.Entry entry2 ) {
            return ((Comparable)entry1.getValue()).compareTo( entry2.getValue() );
          }
      });
  ...

(where must be ?)Comparableにジェネリック パラメータとして渡すための構文(警告に表示された型キャストを削除できるようにするため) は、私にはわかりません。Map.Entry<K, V>VComparable(Comparable)

警告

コンパイラの意地悪な苦情:

SortableValueMap.java:24: 警告: [チェックされていない] raw タイプ java.lang.Comparable のメンバーとしての compareTo(T) へのチェックされていない呼び出し

   return ((Comparable)entry1.getValue()).compareTo( entry2.getValue() );

質問

警告なしで (コンパイル中に警告を抑制せずに) コンパイルするようにコードを変更するにはどうすればよい-Xlint:uncheckedですか?

関連している

ありがとうございました!

4

3 に答える 3

6

Vインターフェースを拡張する型を宣言しComparable<V>ます。Map.Entryそうすれば、オブジェクトのキャストを削除して、(Comparable)代わりに推論された型を使用できます。

public class SortableValueMap<K, V extends Comparable<V>>
             extends LinkedHashMap<K, V> {

....

    Collections.sort(list, new Comparator<Map.Entry<K, V>>() {
        public int compare(Map.Entry<K, V> entry1, Map.Entry<K, V> entry2) {
            return entry1.getValue().compareTo(entry2.getValue());
        }
    });
于 2011-01-02T05:43:37.740 に答える
2

値は、comparable のサブクラスである必要があります。

SortableValueMap<K, V extends Comparable>

上記を試してください。

于 2011-01-02T05:51:15.773 に答える
1

Comparable を Map.Entry にジェネリック パラメータとして渡すための構文 (V は Comparable である必要がありますか?) -- 警告に示されている (Comparable) 型キャストを削除できるようにするため -- 私にはわかりません。

どうですか:

public class SortableValueMap <K, V extends Comparable<V>> extends LinkedHashMap<K, V> { 
  ...
    Collections.sort(list, new Comparator<Map.Entry<K, V>>() {
        public int compare(Map.Entry<K, V> entry1, Map.Entry<K, V> entry2) {
            return (entry1.getValue()).compareTo(entry2.getValue());
        }
    });

しかし、あなたの意図に応じて、これはより良いかもしれません:

public class SortableValueMap <K, V extends Comparable<? super V>> extends LinkedHashMap<K, V> { ...

http://download.oracle.com/javase/tutorial/extra/generics/morefun.htmlを参照してください。

T がそれ自体と正確に比較できる必要はありません。必要なのは、T がそのスーパータイプの 1 つと比較可能であることだけです。これにより、次のことがわかります。

public static <T extends Comparable<? super T>>  max(Collection<T> coll)

... この推論は、任意の型に対して機能することを目的とした Comparable のほとんどすべての使用法に適用されます。常にComparable <? super T>. ...

于 2011-01-02T05:54:44.493 に答える