1. ホーム
  2. java

[解決済み] ジェネリッククラスによるComparableの実装

2022-02-15 18:40:55

質問

汎用的なComparableインタフェースを実装したクラスを定義したい。クラス内に汎用型要素 T . このインターフェースを実装するために、私は比較を T . 以下は私のコードです。

public class Item<T extends Comparable<T>> implements Comparable<Item> {

    private int s;
    private T t;

    public T getT() {
        return t;
    }

    @Override
    public int compareTo(Item o) {
        return getT().compareTo(o.getT());
    }
}

これをコンパイルしようとすると、次のようなエラー情報が表示されます。

Item.java:11: error: method compareTo in interface Comparable<T#2> cannot be applied to given types;
        return getT().compareTo(o.getT());
                     ^
  required: T#1
  found: Comparable
  reason: actual argument Comparable cannot be converted to T#1 by method invocation conversion
  where T#1,T#2 are type-variables:
    T#1 extends Comparable<T#1> declared in class Item
    T#2 extends Object declared in interface Comparable
1 error

どなたか原因と解決方法を教えてください。

どのように解決するのですか?

Item (型引数なし)は 生タイプ ということです。

  1. 任意の種類の Item から Item.compareTo . 例えば、このようにコンパイルされます。

    new Item<String>().compareTo(new Item<Integer>())
    
    
  2. メソッド o.getT() は以下を返します。 Comparable の代わりに T となり、コンパイルエラーとなります。

    1.の例では、(1)と同じように、(2)のように Item<Integer> から Item.compareTo を渡すと、誤って IntegerString.compareTo . このコンパイルエラーによって、そのようなコードを書くことができなくなります。

生タイプを削除すればいいだけだと思うのですが。

public class Item<T extends Comparable<T>>
implements Comparable<Item<T>> {

    ...

    @Override
    public int compareTo(Item<T> o) {
        return getT().compareTo(o.getT());
    }
}