Как установить ограничения на универсальные типы в Java? - PullRequest
38 голосов
/ 17 января 2010

У меня есть общий класс:

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

Теперь я хочу сделать что-то вроде следующего:

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

Вопрос:

Как я могу определить метод compareTo() с учетом общего T?

Полагаю, мне нужно каким-то образом реализовать ограничение на общий T, чтобы сказать, что T реализует определенный интерфейс (возможно Comparable, если такой существует).

Может ли кто-нибудь предоставить мне небольшой пример кода?

Ответы [ 4 ]

46 голосов
/ 17 января 2010

Читайте также обсуждение здесь: Обобщения и сортировка в Java

Короткий ответ, лучшее, что вы можете получить:

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

Но есть и причина просто использовать:

class ListObject<T extends Comparable> {
    ...
}
5 голосов
/ 17 января 2010

Это зависит от того, что именно вы хотите сделать методом CompareTo. Простое определение метода compareTo для других значений ListObject<T> выполняется с помощью следующего

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

Однако, если вы действительно хотите вызывать методы для этого параметра, вам нужно добавить некоторые ограничения, чтобы получить дополнительную информацию о значении T, например,

class ListObject<T extends Comparable<T>> {
  ...
}
2 голосов
/ 17 января 2010

Попробуйте public class ListObject<T extends U>. Только T s, которые реализуют U (или происходят от U), будут допустимыми заменами.

0 голосов
/ 17 января 2010
public class ListObject<T implements Comparable> {...}
...