К сожалению, вы не можете проверить это статически ... По крайней мере, не используя ==
, который использует метод Java Object#equals
, где все решительно определяется в терминах необработанных объектов.
Если вам нужна безопасность типов, тогда ваш единственный выбор - реализовать другой оператор, возможно, что-то вроде =|=
, а затем объединить его с классами типов для обеспечения вашей безопасности.
Я полагаю, что у scalaz также есть что-то полезное для равенства типов, но я не знаю библиотеку достаточно хорошо, чтобы утверждать это наверняка.
Другой подход, который вы можете использовать, который будет безопасен только во время выполнения, - это использование canEqual
шаблона , как описано здесь . Это уже используется case-классами и предлагает хороший способ выборочно нарушать LSP, когда это подходит для равенства.