2014-12-22 2 views
4

Следующий код:Почему этот код компилируется? (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>, он не будет компилироваться и дать ошибку. Так почему он компилируется сейчас? Почему компилируется исходный тип?

+0

Не можете увидеть точку кого-то downvoting это? По крайней мере, для меня это кажется законным вопросом. –

+2

Нет, он не расширяет '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

+0

Извините, я имел в виду, что он реализует Сопоставимый и строка не супер scruby. Как он наследует что-либо от Integer? – nhooyr

ответ

3
JavaTest.<scruby>max(List, 0, 0); 

scruby является необработанным. Это подавляет некоторые проверки типов.

Вы должны добавить все необходимые параметры типа:

JavaTest.<scruby<Integer>>max(List, 0, 0); 

Или просто позволить Java вывести их:

JavaTest.max(List, 0, 0); 
+0

О, так как это сырой тип, он просто не проверяет? O.O Интересно, спасибо за помощь! – nhooyr

+1

Да. В принципе, как только вы вводите необработанный тип, все типичные проверки типа, относящиеся к нему, подавляются, за исключением предупреждений, и проверка отводится во время выполнения, как это было в дни перед дженериками. Помните, что Java ожидает, что использование типов raw будет ограничено старым, устаревшим кодом. – RealSkeptic

Смежные вопросы