TL; DR : абсолютно возможно сравнить два Comparable
параметризованных экземпляров некоторых типов c типа T<E>
независимо от типа стирания.
Один ответ: …
„… но поскольку E
не привязан, он в основном стирается до Object
и это действительно не даст вам реальной возможности сравнивать объекты … «
Произошло стирание типа . Однако - , по крайней мере, в контексте процитированной выше гипотезы - стирание типа не является проблемой в этом контексте. Проблема в этом контексте и в том, что касается исходного вопроса: E
в конечном итоге будет некоторым специфическим c типом, когда данный параметризованный тип создается фактическим аргументом типа на сайте использования .
@ Гипотеза Turing85 поднимает этот вопрос:
Q : Каким бы ни был окончательный тип E
, является ли он обязательным для него реализовать Comparable
, чтобы была «реальная возможность сравнения объектов»?
A : Нет . В контексте исходного вопроса речь идет не о E
реализации Comparable
. В этом контексте это примерно MyLinkedList
реализация Comparable
.
Объявление универсального класса c с параметром несвязанного типа E
не исключает возможности сравнения объектов. Например, в некоторых случаях необходимо иметь MyLinkedList<MyLinkedList<Foo>>
; где неограниченный E
равен MyLinkedList<Foo>
во внешнем параметризованном типе, а неограниченный E
- это Foo
во внутреннем параметризованном типе.
В эта рабочая демонстрация Я реализовал упрощенную репрезентативную модель связанного списка. В моей упрощенной модели Bar
не реализует Comparable
. MyLinkedList<E>
сам по себе реализует Comparable<E>
.
Пример использования…
public class Bar {
private int y;
public Bar(int y){
this.y = y;
}
}
...
MyLinkedList<Bar> list1 = new MyLinkedList<>();
MyLinkedList<MyLinkedList<Bar>> list2 = new MyLinkedList<>();
MyLinkedList<Bar> list3 = new MyLinkedList<>();
...
list1.add(new Bar(100));
list2.add(list3);
list3.add(new Bar(101));
...
if (list2.compareTo(list1) != 0){ ... }
...
Щелкните зеленый Пуск кнопка вверху демо . Тогда вы можете заметить, что не имеет значения, что E
не имеет границ в объявлении MyLinkedList<E>
. Не имеет значения, что Bar
не реализует Comparable
.
Абсолютно возможно сравнение двух Comparable
параметризованных экземпляры MyLinkedList<E>
без проблем…
...
[node -> [node -> Bar: y=101]] is greater than [node -> Bar: y=100]
...
Стоит повторить: в моей демонстрационной модели Bar
не реализует Comparable
.
Также стоит отметить, что, независимо от стирания типа, то, что наблюдается в stdout
, показывает, что независимо от типа среды выполнения node
отображается здесь, в нем есть все опубликованные c, нестатистические c члены типа Bar
.