Я смотрю на некоторые классы Java, которые имеют следующую форму:
public
abstract
class A <E extends A<E>> implements Comparable <E> {
public final int compareTo( E other ) {
// etc
}
}
public
class B extends A <B> {
// etc
}
public
class C extends A <C> {
// etc
}
Мое использование "Сопоставимых" здесь должно только проиллюстрировать возможное применение универсального параметра "E". Это использование дженериков/наследования имеет имя? Для чего это используется?
Мое впечатление - то, что это позволяет абстрактному классу обеспечивать общую реализацию метода (такого как compareTo), не имея необходимость обеспечивать его в подклассах. Однако в этом примере, в отличие от унаследованного метода это ограничило бы подклассы вызовом compareTo на других экземплярах того же подкласса, а не любого подкласса "A". Это звучит правильным?
Так или иначе, просто любопытный, если какие-либо гуру там видели это прежде и знают то, что это делает.
Спасибо!
В C ++ он известен как Любопытно повторяющийся шаблон шаблона (CRTP). Я не знаю, есть ли у него другое имя в Java (или даже есть ли у него имя), но, вероятно, он служит аналогичным целям.
Я полагаю, что обычно это просто называется рекурсивным общим типом. Как указывает Том Хотин, вам, вероятно, нужен класс A