Aparte de las dificultades mecánicas que estamos encontrando declarar las firmas, el objetivo no tiene mucho sentido. Está intentando establecer una función de comparación covariante, que rompe la idea de establecer una interfaz que las clases derivadas puedan adaptar.
Si define alguna subclase SubClass
tal que sus casos sólo pueden ser comparados con otros SubClass
casos, entonces, ¿cómo SubClass
satisfacer el contrato definido por MyClass
? Recuerde que MyClass
dice que él y cualquier tipo derivado de él se pueden comparar con otras instancias de MyClass
. Está tratando de hacer que eso no sea cierto para SubClass
, lo que significa que SubClass
no cumple con el contrato de MyClass
: No puede sustituir SubClass
por MyClass
, porque los requisitos de SubClass
son más estrictos.
Este problema se centra en la covarianza y la contravarianza, y cómo permiten que las firmas de funciones cambien a través de la derivación de tipo. Puede relajar un requisito en un tipo de argumento, que acepta un tipo más amplio que las demandas de firma del supertipo, y puede fortalecer un requisito en un tipo de retorno, prometiendo devolver un tipo más estrecho que la firma del supertipo. Cada una de estas libertades aún permite la sustitución perfecta del tipo derivado por el supertipo; un llamante no puede notar la diferencia cuando utiliza el tipo derivado a través de la interfaz del supertipo, pero un llamador que utiliza el tipo derivado puede aprovechar estas libertades en concreto.
Willi's answer enseña algo sobre las declaraciones genéricas, pero le insto a que reconsidere su objetivo antes de aceptar la técnica a expensas de la semántica.
Creo que eso es todo. – Pointy
Considere (1) la clase MyImpl1 extiende MyClass {...}; y (2) la clase MyImpl2 extiende MyClass {public int compareTo (MyImpl1 o) {...}}. MyImpl2 no está haciendo lo correcto. –
emory
Si suponemos que cada subclase extiende MyClass con su propia clase como parámetro genérico, la solución es correcta. Sin embargo, parece que no hay forma de garantizar esto, como señaló emory. – Cem