Java. Значение <T расширяет сравнимое <T>>?
Полный контекст:
public class RClass<T extends Comparable<T>>
Я был бы прав, сказав, что утверждение в заголовке означает, что аргументы, включенные в этот метод, должны быть либо объектом класса, который реализует Comparable OR один из его производных классов?
Спасибо.
Ответы
Ответ 1
Это означает, что параметр типа должен поддерживать сравнение с другими экземплярами своего собственного типа через интерфейс Comparable.
Пример такого класса приведен в учебнике Oracle Object Ordering. Обратите внимание на аналогичный шаблон T extends Comparable<T>
в выдержке ниже:
public class Name implements Comparable<Name> {
...
public int compareTo(Name n) { ... }
}
Ответ 2
Java. Значение <T extends Comparable<T>>
?
a) Comparable <T>
это общий интерфейс (помните, что это "интерфейс", а не "класс" )
b) extends
означает наследование от класса или интерфейса.
Из вышеприведенной точки # a это интерфейс.. (Помните, что это наследование от "интерфейса", а не от "класса" )
c) Из выше сказанного обе точки #a и #b,
здесь "один интерфейс" расширяет "другой интерфейс".
Для этого класса должен быть интерфейс.
просто пример здесь
interface MinMax<T extends Comparable<T>> {
T min();
T max();
}
d) теперь ваш класс i.e public class RClass {}
СЛЕДУЕТ
1 # ЭТО "реализуем" этот "общий интерфейс" Comparable<T>
..!!!
ex: public class RClass<T> implements Comparable<T>
2 # ИЛИ создать интерфейс и перейти к этому "универсальному интерфейсу" Comparable<T>
ex:
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 в этом случае) должен указывать ту же самую границу. Более того, как только эта связь установлена, нет необходимости указывать ее снова в предложении tools.
Ответ 3
Где-то в этом классе программисту нужно написать что-то вроде
if(t.compareTo(othert) < 0) {
...
}
Для того, чтобы работать, тип T должен иметь метод compareTo, который сравнивает его с другим объектом типа T. Расширение Comparable гарантирует существование такого метода, между прочим.
Ответ 4
Да, и имейте в виду, что объекты классов, полученные из объектов Comparable
ARE Comparable
. Наследование - это отношение is-a
.
Ответ 5
Это означает, что вы можете создать экземпляр RClass
с типом, который буквально расширяет Comparable<T>
. Таким образом,
RClass<Integer> a;
допустимо, поскольку Integer
продолжается Comparable<Integer>
, а
RClass<Object> b;
нет, так как Object
не является классом, который вообще сравним.
Ответ 6
Проще говоря, общий тип T должен быть сопоставим для сравнения. иначе вы не сможете сделать T.compareTo.
В пункте 28 "Эффективная java" предлагается: "always use Comparable<? super T> in preference to Comparable<T>. <T extends Comparable<? super T>>"
Ответ 7
== > guhanvj, <T extends Comparable<T>>
означает, что <T>
имеет верхнюю границу объектов Comparable<T>
. Таким образом, <T>
может иметь типы классов Byte, Character, Double, Float, Long, Short, String и Integer, которые реализуют интерфейс Comparable<T>
для естественного упорядочения.