Нет, боюсь, это невозможно.
Если вы попробуете свой код, компилятор пожалуется:
'equals' hides member of supertype 'Any' and needs 'override' modifier
И если вы добавите Модификатор override
:
An interface may not implement a method of 'Any'
Причины немного неясны и наследуются (!) От Java.
Изначально интерфейсы могли содержать только абстрактные методы (и постоянные поля). Когда была добавлена возможность указывать реализации методов в интерфейсах, это было сделано таким образом, чтобы не нарушать существующий код, поэтому они применяются только там, где классы уже не имеют реализации. (В Java они называются методами по умолчанию, чтобы усилить это.) Если у класса есть реализация, определенная в классе или в суперклассе, которая используется, и значение по умолчанию игнорируется.
Есть несколько угловых случаев: методы, определенные в Object (Java эквивалент Kotlin * Any ). Это clone () , равно () , finalize () , getClass () , hashCode () , notify () , notifyAll () , toString () и wait () . (Большинство из них редко используются непосредственно в наши дни, но, конечно, equals()
, hashCode()
и toString()
очень важны.)
Поскольку эти методы определены в Object
, каждый класс имеет их непосредственная реализация (либо из Object
, либо из некоторого подкласса). И поэтому реализация интерфейса по умолчанию никогда не может быть использована.
Точно то же самое относится к Kotlin / JVM и соответствующим методам, определенным в Any
- фактически, компилятор делает это явным, выдавая ошибку, если вы попытаетесь обеспечить реализацию по умолчанию любого из этих методов, как показано выше.
Это позор, потому что есть случаи, когда реализация по умолчанию equals()
, hashCode()
и / или toString()
будет быть чрезвычайно полезным! Но это привело бы к сложности, хрупкости и некоторым неожиданным угловым случаям; см. этот ответ для достоверного объяснения.