Использование дженериков для создания функции max, которая возвращает большую - PullRequest
3 голосов
/ 28 июля 2010

В Java, как бы я использовал дженерики для создания функции max, которая принимает в качестве параметров два сопоставимых объекта одного типа и возвращает больший?

Я пытался:

public static <T extends Comparable> T max(T obj1, T obj2)
{
    return ( ((obj1).compareTo(obj2) >= 0) ? obj1 : obj2);
}

(Возвращает obj1, если они оба равны.)

Метод основан на коде, который я нашел в http://www.informit.com/articles/article.aspx?p=170176&seqNum=3.

Однако, когда я компилирую его, я получаю это предупреждение (компилирование с -Xlint: unchecked): предупреждение: [непроверенный] непроверенный вызов CompareTo (T) как члена необработанного типа java.lang.Comparable

Ответы [ 3 ]

11 голосов
/ 28 июля 2010

Это происходит потому, что вы используете необработанный тип Comparable, а компилятор не может быть уверен, с чем вы сравниваете, так как compareTo использует параметр типа Comparable. Вам также необходимо параметризовать Comparable:

public static <T extends Comparable<? super T>> T max(T obj1, T obj2)

Вам необходимо использовать ? super T, поскольку у вас может быть класс A, который расширяет класс B, который реализует Comparable<B>, но A не реализует Comparable<A>. Таким образом, вы можете передать максимум два объекта A, и B соответствует ? super A, так что вы можете вызвать метод compareTo, определенный в B, даже для объектов A. Если бы вы использовали <T extends Comparable<T>> и попытались передать два объекта A, компиляция жаловалась бы, что они не реализуют Comparable<A>, даже если они наследуют метод compareTo от B.

6 голосов
/ 28 июля 2010

Взгляните на метод максимального класса заказа Гуавы Ordering.max (a, b) .

0 голосов
/ 28 июля 2010

public static <T extends Comparable<T>> удалит предупреждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...