2010-03-04 9 views
7

estoy mirando algunas clases Java que tienen la siguiente forma:¿Qué hace este paradigma de genéricos de Java y cómo se llama?

 

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 
} 

 

Mi uso de "comparables" aquí es sólo para ilustrar un posible uso del parámetro genérico "E". ¿Este uso de genéricos/herencia tiene un nombre? ¿Para qué se usa esto?

Mi impresión es que esto permite que la clase abstracta proporcione una implementación común de un método (como compareTo) sin tener que proporcionarlo en las subclases. Sin embargo, en este ejemplo, a diferencia de un método heredado, restringiría subclases para invocar compareTo en otras instancias de la misma subclase, en lugar de cualquier subclase "A". Suena bien?

De todos modos, es curioso si algún gurú ha visto esto antes y sabe lo que hace.

Gracias!

Respuesta

4

En C++, se lo conoce como Curiously Recurring Template Pattern (CRTP). No sé si tiene un nombre diferente en Java (o incluso si tiene un nombre), pero probablemente tenga fines similares.

+0

Esa página wiki tiene esencialmente la explicación que estaba buscando, ¡gracias! La nota sobre el polimorfismo "estático" en tiempo de compilación me pareció bastante interesante. – Tom

+1

Aquí hay una buena discusión orientada a Java: http://madbean.com/2004/mb2004-3/ Busque el encabezado "Más trucos con parámetros de tipo" –

+0

URLs [se deben incluir en una respuesta para leer solo ] (http://meta.stackexchange.com/q/8259). Esta respuesta parece depender en gran medida del contenido de una URL y se beneficiaría de un resumen de la URL incluida en la respuesta. –

0

Creo que generalmente se llama simplemente un tipo genérico recursivo. Como señala Tom Hawtin, es probable que desee que la clase A < E extienda A <E> >. El uso más destacado de este patrón es java.lang.Enum (que probablemente ya conozca si elige Comparable <E> como su interfaz).

+0

No, no lo harías. Deberías usar 'clase A '. – newacct

0

No tiene nombre y generalmente no es útil. Probablemente la persona que lo escribió no se dio cuenta de que podían escribir esta forma:

class A<E> implements Comparable<E> 

Mi impresión es que esto permite que la clase abstracta para proporcionar una implementación común de un método (como compareTo) sin tener para proporcionarlo en las subclases.

No más de lo class A<E>

Sin embargo, en este ejemplo, a diferencia de un método heredado que restringiría subclases de invocar compareTo en otras instancias de la misma subclase, en lugar de cualquier "A" subclase. Suena bien?

No, eso es incorrecto. Lo restringe a invocar compareTo en E, cualquiera que sea E es.