Что делает эта парадигма дженериков Java и чем это называют?

Я смотрю на некоторые классы 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". Это звучит правильным?

Так или иначе, просто любопытный, если какие-либо гуру там видели это прежде и знают то, что это делает.

Спасибо!

7
задан Tom 4 March 2010 в 23:17
поделиться

2 ответа

В C ++ он известен как Любопытно повторяющийся шаблон шаблона (CRTP). Я не знаю, есть ли у него другое имя в Java (или даже есть ли у него имя), но, вероятно, он служит аналогичным целям.

4
ответ дан 7 December 2019 в 14:31
поделиться

Я полагаю, что обычно это просто называется рекурсивным общим типом. Как указывает Том Хотин, вам, вероятно, нужен класс A>. Наиболее известное использование этого паттерна - java.lang.Enum (который вы, вероятно, знали, раз выбрали Comparable в качестве интерфейса).

0
ответ дан 7 December 2019 в 14:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: