Apart from the mechanical difficulties you're encountering declaring the signatures, the goal doesn't make much sense. You're trying to establish a covariant comparison function, which breaks the whole idea of establishing an interface that derived classes can tailor.
If you define some subclass SubClass
such that its instances can only be compared to other SubClass
instances, then how does SubClass
satisfy the contract defined by MyClass
? Recall that MyClass
is saying that it and any types derived from it can be compared against other MyClass
instances. You're trying to make that not true for SubClass
, which means that SubClass
does not satisfy MyClass
's contract: You cannot substitute SubClass
for MyClass
, because SubClass
's requirements are stricter.
This problem centers on covariance and contravariance, and how they allow function signatures to change through type derivation. You can relax a requirement on an argument's type -- accepting a wider type than the supertype's signature demands -- and you can strengthen a requirement on a return type -- promising to return a narrower type than the supertype's signature. Each of these freedoms still allows perfect substitution of the derived type for the supertype; a caller can't tell the difference when using the derived type through the supertype's interface, but a caller using the derived type concretely can take advantage of these freedoms.
Willi's answer teaches something about generic declarations, but I urge you to reconsider your goal before accepting the technique at the expense of semantics.