Это происходит потому, что вы используете необработанный тип 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.