Следующий код:Почему этот код компилируется? (Java общий метод)
import java.util.*;
public final class JavaTest {
public static <T extends Comparable<? super T>> int max(List<? extends T> list, int begin, int end) {
return 5;
}
public static void main(String[] args) {
List<scruby<Integer>> List = new ArrayList<>();
JavaTest.<scruby>max(List, 0, 0); //how does this compile?, scruby doesn't meet
//T extends Comparable<? super T>
}
}
class scruby<T> implements Comparable<String>{
public int compareTo(String o) {
return 0;
}
}
Как оператор JavaTest.max (List, 0, 0) компилировать? Как scruby встретить
T extends Comparable <? super T>
Он реализует Comparable<String>
, который не является супер тип scruby? Если вы измените его на scruby<Integer>
, он не будет компилироваться и дать ошибку. Так почему он компилируется сейчас? Почему компилируется исходный тип?
Не можете увидеть точку кого-то downvoting это? По крайней мере, для меня это кажется законным вопросом. –
Нет, он не расширяет 'String', он расширяет' Integer' из-за 'List> List = new ArrayList <>();' и тогда он не использует ваш метод 'tools Comparable ', он использует [ compareTo] (http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#compareTo (java.lang.Integer)) метод, унаследованный от 'Integer' –
chancea
Извините, я имел в виду, что он реализует Сопоставимый и строка не супер scruby. Как он наследует что-либо от Integer? –
nhooyr