Método de interfaz que toma la misma implementación de la interfaz

Tengo la siguiente interfaz:

public interface ClusterPopulation
{
    public double computeDistance(ClusterPopulation other);
}

¿Es posible especificar dentro de la interfaz misma, que la implementación A de ClusterPopulation solo puede tomar la implementación A como argumento de computeDistance?

La única solución de aproximación que veo es la siguiente, pero no me gusta:

Redefina la interfaz con genéricos:

public interface ClusterPopulation
{
    public <T extends ClusterPopulation> double computeDistance(T other);
}

Dentro de la implementación, arroje IllegalArgumentException si el argumento no es del tipo bueno, haga algunos lanzamientos si el tipo está bien ... Meeeeh!

Incluso con este enfoque, el usuario final solo es consciente de la restricción al leer la documentación / mirar la implementación del código / prueba y error ...

¿Alguna mejor solución?

Respuesta 1

Tuviste la idea correcta con el uso de genéricos, pero en lugar de aplicarlo al método, aplícalo a toda la interfaz.

public interface ClusterPopulation<T extends ClusterPopulation<T>>
{
    double computeDistance(T other);
}

Eso permite que una implementación se defina Tcomo sí misma.

public class ClusterPopulationA implements ClusterPopulation<ClusterPopulationA> {  // ...

Sin embargo, no permite que una implementación lo defina como algo más.

public class BreaksPattern implements ClusterPopulation<ClusterPopulationA>

Incluya en su documentación que todas las subclases deberían definir el parámetro de tipo Tcomo su propia clase.

Respuesta: 2

No puedo obtener el nombre del grupo bajo el cual se almacena el contacto. Puedo saber si se agrega en cualquier grupo como valor booleano (IN_VISIBLE_GROUP). No tengo idea de cómo obtener el nombre o id del grupo. ...

Después de una actualización de Hibernate 3 a 4, estamos trabajando en algunos problemas que aparecieron en el camino. Uno que nos tiene particularmente perplejos es una UnsupportedOperationException, donde un ...

Tengo clases de árbol, por ejemplo, ClassA, ClassB, ClassC. ClassA y ClassB extiende ClassC. Tengo dos Multimaps: Multimap <Integer, ClassA> y Multimap <Integer, ClassB> y me gustaría fusionar ...

En nuestra empresa, tenemos muchas pruebas de interfaz de usuario que se ejecutan en dispositivos virtuales / reales. Después de correr durante algún tiempo, las pruebas se bloquean al azar, lo que creo que es el resultado de que el descriptor de archivo exceda: Solía ​​...