web-dev-qa-db-ja.com

Javaでジェネリック型に制約を設定するにはどうすればよいですか?

私はジェネリッククラスを持っています:

_public class ListObject<T>
{
    // fields
    protected T _Value = null;
      // ..
}
_

今、私は次のようなことをしたいです:

_ListObject<MyClass> foo = new ListObject<MyClass>();
ListObject<MyClass> foo2 = new ListObject<MyClass>();
foo.compareTo(foo2);
_

質問:

ジェネリックTに再定義してcompareTo()メソッドを定義するにはどうすればよいですか?

ジェネリックTに制約を実装して、Tが特定のインターフェース(存在する場合はComparable)を実装するように指示する必要があると思います。

誰かが小さなコードサンプルを私に提供できますか?

40
citronas

こちらのディスカッションもお読みください: Javaでのジェネリックとソート

短い答え、あなたが得ることができる最高のものは:

class ListObject<T extends Comparable<? super T>> {
    ...
}

しかし、使用するだけの理由もあります。

class ListObject<T extends Comparable> {
    ...
}
49
nanda

これは、compareToメソッドで何を実行するかによって異なります。他のListObject<T>値を取るようにcompareToメソッドを定義することは、以下によって実行されます

public class ListObject<T> {
  public int compareTo(ListObject<T> other) {
    ...
  }
}

ただし、そのパラメーターで実際にメソッドを呼び出す場合は、T値に関する詳細情報を提供するために、いくつかの制約を追加する必要があります。

class ListObject<T extends Comparable<T>> {
  ...
}
5
JaredPar

public class ListObject<T extends U>をお試しください。 Tを実装する(またはUから派生する)Usのみが、許可される置換になります。

2
John Feminella