Я думаю, вы совершили неверный логический прыжок.
T extends Comparable<T>
не не означает, что
Comparable<T> extends Comparable<Comparable<T>>
Краткая аналогия :
Предположим, что камнедробилка - это любой материал, который может раздробить камень , а камень просто способен разрушить сам себя. Так что скала - это камнедробилка. Означает ли это, что камень может разрушить любое вещество, которое может разрушить камень? Ясно, что нет: сталь также может быть дробилкой, в то время как камень может не разрушить сталь.
Длинная (на основе кода) аналогия :
Предположим, у меня есть интерфейс Additive<T>
, который можно использовать для описания любого типа, с которым вы можете выполнить операцию add
над T
объектом и получить обратно T
.
Теперь допустим, у меня есть какой-то метод, подпись которого выглядит следующим образом:
public static <T extends Additive<T>> add(T x, T y) { ... }
Поскольку x
должен иметь тип, к которому я могу добавить T
, этот метод может быть реализован следующим образом:
return x.add(y);
Имеет смысл? Ок, отлично; но теперь давайте сделаем предположение, которое вы сделали в своем вопросе: Additive<T>
должно расширяться Additive<Additive<T>>
; в таком случае я могу предположить, что могу добавить к x
экземпляр любого типа, реализующего Additive<T>
.
Вот где предположение нарушается. Я мог бы иметь тип, скажем ...
// A 32-bit integral number supporting addition
public class Int32 implements Additive<Int32> { ... }
Это имело бы смысл, верно? Я мог бы также иметь что-то вроде этого:
// A list of 32-bit integral numbers supporting appending
public class Int32List implements Additive<Int32> { ... }
Теперь, если T extends Additive<T>
подразумевает, что Additive<T> extends Additive<Additive<T>>
, тогда я смогу сделать это:
Additive<Int32> x = new Int32(5);
Additive<Int32> y = x.add(new Int32List());
Имеет ли это какой-то смысл?