2016-05-26 7 views
0

Может кто-нибудь объяснить разницу между <T extends Number & Comparable<T>> и T extends Comparable<? extends Number>?Разница между генериками <T extends Number & Comparable <T>> и T extends Comparable <? extends Number>

Они выглядят похожими на меня, и оба они отлично компилируются для типа подклассов. В арг Недопустимый тип ошибки показывает ниже

Параметр Тип не находится в пределах связанного параметра, следует осуществить «» java.lang.Number

и

параметр типа не находится в пределах границы параметр; должен распространяться 'java.lang.Comparable>'

соответственно.

+1

Показать ваш код. О какой ошибке вы говорите? Когда это получится? –

ответ

2

Вы не сможете использовать:

Comparable<? extends Number> 

, потому что только методы, определенные Comparable являются потребители (в смысле PECS): он должен принимать экземпляры типа ? extends Number в его compareTo метод - и нет такого типа, который бы точно соответствовал бы этой привязке.

Integer является Comparable<? extends Number>, но также Double. Таким образом, вы не можете безопасно позвонить instance1.compareTo(instance2), потому что он потерпит неудачу, если эти экземпляры конкретно Integer и Double соответственно, так как Integer.compareTo может принимать только параметры Integer.

Таким образом, компилятор не позволяет вам вызвать этот метод в первую очередь.

+0

, когда вы говорите, что нет типов, что вы имеете в виду? Является ли класс Integer не типом, который будет удовлетворять оценке? – Veeram

+0

@ShivV: Он означает, что значение типа 'T' не сможет' .compareTo() 'ничего. – newacct

+0

@ShivV Отредактировал мой ответ, чтобы добавить больше объяснений. –

1

Вариант 1:

public class A <T extends Number & Comparable<T>>{} 

Ваш универсальный параметр должен распространяться номер и реализует Сопоставимые, , что означает класс А это число и Сопоставимые.

Вариант 2:

public class B <T extends Comparable<? extends Number>>{} 

Т Сопоставимые на цифрах (можно сравнить только номер), но не обязательно должен быть номер, в отличие от опции 1

Поясню например:

A

public class A <T extends Number & Comparable<T>>{} 

Б

public class B <T extends Comparable<? extends Number>>{} 

IntegerWrapper (Вариант 2)

public class IntegerWrapper implements Comparable<Integer> { 

     Integer number; 

     public IntegerWrapper(int number) { 
     this.number = number; 
     } 

     @Override 
     public int compareTo(Integer o) { 
     return number.compareTo(o); 
     } 
    } 

GenericsTest общественного класса GenericsTest {

public static void main(String args[]){ 
    A myA = new A<Integer>(); 

    B myB = new B<IntegerWrapper>(); 
    } 
} 

Я думаю, что вариант 1 - это то, что вы ищете, потому что я не могу придумать много полезных сценариев для варианта 2 (возможно, есть ...)

+0

«T сопоставим по числам (может сравнивать только число), но не обязательно должно быть числом« Можете ли вы подробнее рассказать? – Veeram

+1

T Сопоставим для типов Number, но не нужно расширять класс Number, такой как опция 1 -> T extends Number, только для сравнения . и было определено как T расширяет число. из моего примера IntegerWrapper не расширяет класс Number, но реализует Comparable

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