Помимо механических трудностей, с которыми вы сталкиваетесь при объявлении подписей, цель не имеет особого смысла.Вы пытаетесь установить ковариантную функцию сравнения, которая разрушает саму идею создания интерфейса, который могут адаптировать производные классы.
Если вы определяете некоторый подкласс SubClass
, так что его экземпляры можно сравнивать только с другимиSubClass
экземпляров, тогда как SubClass
удовлетворяет договору, определенному MyClass
?Напомним, что MyClass
говорит, что его и любые производные от него типы можно сравнить с другими MyClass
экземплярами.Вы пытаетесь сделать это неверным для SubClass
, что означает, что SubClass
не удовлетворяет контракту MyClass
: вы не можете заменить SubClass
на MyClass
, потому что требования SubClass
более строгие.
Эта проблема сосредоточена на ковариации и контравариантности, а также на том, как они позволяют сигнатурам функций изменяться при выводе типов.Вы можете ослабить требование к типу аргумента - принимая более широкий тип, чем требования сигнатуры супертипа - и вы можете усилить требование к типу возврата - обещая вернуть более узкий тип, чемподпись супертипа.Каждая из этих свобод все еще позволяет совершенную замену производного типа на супертип;вызывающая сторона не может определить разницу при использовании производного типа через интерфейс супертипа, но вызывающая сторона, использующая производный тип конкретно, может воспользоваться этими свободами.
Ответ Вилли учит кое-чемуобщие заявления, но я призываю вас пересмотреть свою цель, прежде чем принимать технику за счет семантики.