извините за возвращение, но я думаю, что это важно. Ваш код перестал работать должным образом при изменении с Collections.max () на Algorithm.max ()? Я выполнил аналогичный тест в jdk8, и я не понимаю, почему он работает нормально, а в соответствии с Java Generics и Collections - нет.
У меня есть абстрактный класс Fruit (реализующий Comparable):
public abstract class Fruit implements Comparable<Fruit> {
private String name;
private int size;
public Fruit(String name, int size) {
this.name = name;
this.size = size;
}
public int compareTo(Fruit that) {
if (size < that.size)
return -1;
else if (size == that.size)
return 0;
else
return 1;
}
}
Тогда у меня есть Apple, расширяющий класс Fruit:
public class Apple extends Fruit {
public Apple(String name, int size) {
super(name, size);
}
}
И наконец:
public class GenericsTest {
@Test
public void test1() {
final Apple a1 = new Apple("apple1", 50);
final Apple a2 = new Apple("apple2", 70);
final Apple a3 = new Apple("apple3", 34);
final List<Apple> apples = Lists.newArrayList(a1, a2, a3);
System.out.println(GenericsTest.max(apples).getSize());
}
private static <T extends Comparable<T>> T max(Collection<? extends T> coll) {
T max = coll.iterator().next();
for (T elm : coll) {
if (max.compareTo(elm) < 0)
max = elm;
}
return max;
}
}
Код работает, а нет? super T в сигнатуре метода max, а список имеет тип Apple. Согласно цитате, которую вы упомянули, она не должна работать. Я, кажется, озадачен здесь ...