Что делает эта парадигма дженериков Java и как она называется? - PullRequest
7 голосов
/ 05 марта 2010

Я смотрю на некоторые классы 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
}


Мое использование "Comparable" здесь просто для иллюстрации возможного использования универсального параметра "E". У этого использования дженериков / наследования есть имя? Для чего он используется?

У меня сложилось впечатление, что это позволяет абстрактному классу предоставлять общую реализацию метода (например, CompareTo) без необходимости предоставлять его в подклассах. Однако в этом примере, в отличие от унаследованного метода, он будет ограничивать подклассы вызовом CompareTo для других экземпляров того же подкласса, а не для любого подкласса "A". Это звучит правильно?

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

Спасибо!

Ответы [ 3 ]

4 голосов
/ 05 марта 2010

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

0 голосов
/ 29 декабря 2013

У него нет имени, и обычно оно бесполезно. Вероятно, человек, который написал это, не понимал, что они могли бы написать это так:

class A<E> implements Comparable<E>

У меня сложилось впечатление, что это позволяет абстрактному классу общая реализация метода (например, CompareTo) без предоставить его в подклассах.

Не более class A<E>

Однако в этом примере, в отличие от унаследованного метода, он будет ограничивать подклассы для вызова CompareTo на других экземплярах того же подкласс, а не любой подкласс "A". Это звучит правильно?

Нет, это неправильно. Он ограничивается вызовом compareTo на E, каким бы E ни был.

0 голосов
/ 05 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...