2014-12-19 4 views
0

У меня есть класс, как это:Почему универсальное ограничение T extends Comparable <T> недостаточно, чтобы избежать приведения?

public class AbstractParameter<T extends Comparable> { 
    .... 
    public void validate(T tempVal, StringBuilder msg) { 
     if(tempVal.compareTo(new Integer(0)) != 0) { 
      //do something 
     } 
    } 
    .... 
} 

tempVal будет Integer. Он компилируется и работает нормально. Но если я изменю T расширяет Сопоставимые к T extends Comparable<T> выше, если заявление генерируется следующая ошибка компиляции:

required: T#1 
found: Integer 
reason: actual argument Integer cannot be converted to T#1 by method invocation conversion 
where T#1,T#2 are type-variables: 
    T#1 extends Comparable<T#1> declared in class AbstractParameter 
    T#2 extends Object declared in interface Comparable 

Я могу бросить в новый Integer (0) к T удалить ошибку компиляции , Мой вопрос: следует ли использовать public class AbstractParameter<T extends Comparable> или public class AbstractParameter<T extends Comparable<T>>?

Я думаю, что public class AbstractParameter<T extends Comparable<T>> должен быть способ пойти, но что (T)new Integer(0) литье кажется раздражением. Что-то не так в моем коде?

+7

Как вы знаете (или можешь принудительно), что 'tempVal' будет' Integer' или можно сравнить с 'Integer'? –

ответ

4

Поскольку тип параметра равен Comparable<T>.compareTo(), это T, и вы отправляете целое число, которое несовместимо. Спросите себя: если вы знаете, что tempVal является Integer, почему вы объявляете его как T?

+0

Побей меня. :) –

0

общественного абстрактного класса AbstractParameter реализует Сопоставимые произведет ошибку компиляции, потому что внутри validate вы вызывающую compareTo на tempVal и Поскольку нет UpperBound на Т (Т может быть что угодно) компилятор не может разрешить методу tempVal.compareTo(...)

Вы упомянули, что «TempVal будет Integer» в вашем сообщении. Таким образом изменить определение класса, чтобы включить эту информацию для того, чтобы избежать непроверенного Предупреждения

public abstract class AbstractParameter<T extends Comparable<Integer>> 
Смежные вопросы