Java- Значение? - PullRequest
       17

Java- Значение?

31 голосов
/ 16 декабря 2011

Полный контекст:

public class RClass<T extends Comparable<T>>

Могу ли я сказать, что утверждение в заголовке означает, что аргументы, включенные в метод, должны быть либо объектом класса, который реализует Comparable, либо одним из его производных классов?

Спасибо.

Ответы [ 7 ]

33 голосов
/ 16 декабря 2011

Это означает, что параметр типа должен поддерживать сравнение с другими экземплярами своего собственного типа через интерфейс Comparable.

Пример такого класса приведен в руководстве по Oracle Упорядочение объектов .Обратите внимание на шаблон, аналогичный T extends Comparable<T> в приведенной ниже выдержке:

public class Name implements Comparable<Name> {
   ...
   public int compareTo(Name n) { ... }
}
9 голосов
/ 07 января 2014

Java- Значение <T extends Comparable<T>>?

а) Comparable <T> это общий интерфейс (помните, что это «интерфейс», т.е. не «класс»)

b) extends означает наследование от класса или интерфейса.

Из вышеприведенного пункта # a это интерфейс. (Помните, что это наследование от "интерфейса", т.е. не от "класса")

в) Из вышеупомянутых обеих точек #a & #b,

здесь «один интерфейс» расширяет «другой интерфейс».

Для этого класса должен быть определен интерфейс. просто пример здесь

interface MinMax<T extends Comparable<T>> { 
    T min(); 
    T max(); 
} 

г) теперь ваш класс, т.е. public class RClass {} ДОЛЖЕН

1 # ЛИБО "реализовать" этот "универсальный интерфейс" Comparable<T> .. !!!

например: public class RClass<T> implements Comparable<T>

2 # ИЛИ создать интерфейс и расширить до этого «универсального интерфейса» Comparable<T> например:

interface MinMax<T extends Comparable<T>> { 
   T min(); 
   T max(); 
} 
class RClass<T extends Comparable<T>> implements MinMax<T> {
    .....
    .....
}

Здесь, Обратите особое внимание на способ, которым параметр типа T объявлен RClass и затем перешел на MinMax. Поскольку MinMax требуется тип, который реализует Comparable, класс реализации (в данном случае RClass) должен указывать ту же границу. Более того, как только эта граница установлена, нет необходимости указывать ее снова в предложении Implements.

5 голосов
/ 16 декабря 2011

Где-то в этом классе программисту нужно написать что-то вроде

if(t.compareTo(othert) < 0) {
    ...
}

Чтобы это работало, тип T должен иметь метод CompareTo, который сравнивает его с другим объектом типа T. Расширение Comparableсреди прочего гарантирует существование такого метода.

2 голосов
/ 16 декабря 2011

Это означает, что вы можете создать только экземпляр RClass с типом, который буквально расширяет Comparable<T>. Таким образом,

RClass<Integer> a;

приемлемо, поскольку Integer расширяется Comparable<Integer>, а

RClass<Object> b;

нет, поскольку Object не является классом, который вообще расширяется.

2 голосов
/ 16 декабря 2011

Да, и имейте в виду, что объекты классов получены из Comparable ARE Comparable объектов. Наследование - это is-a отношение.

1 голос
/ 02 апреля 2016

==> guhanvj, <T extends Comparable<T>> означает, что <T> имеет верхнюю границу Comparable<T> объектов. Таким образом, <T> может иметь типы классов Byte, Character, Double, Float, Long, Short, String и Integer, которые все реализуют интерфейс Comparable<T> для естественного упорядочения.

1 голос
/ 25 февраля 2016

Проще говоря, универсальный тип T должен быть сопоставим для сравнения. в противном случае вы не можете сделать T.compareTo. В пункте 28 «Эффективная Java» предлагается: "always use Comparable<? super T> in preference to Comparable<T>. <T extends Comparable<? super T>>"

...