Вы не можете использовать is this::class
, потому что вы сравниваете его с other
, который является Any?
. В любом случае это не будет полезным сравнением, потому что this::class
- это KClass<IsTesting>
, а не IsTesting
.
. Вы хотите сравнить other::class
с this::class
с проверкой равенства, а не с is
проверка. Но сначала вы должны проверить, является ли other
нулем, или вы не можете получить его класс. Но также умное приведение не может вывести из ::class
сравнения тип other
, поэтому вы также должны проверить это.
override fun equals(other: Any?): Boolean {
other ?: return false
if (other !is IsTesting)
return false
return when(other::class) {
this::class -> this.myProperty == other.myProperty
else -> false
}
}
Ваш пример кода подходит только для финального класса. Для открытого класса он будет соответствовать подклассам, которые могут иметь дополнительные свойства.
Также рассмотрим data class
, который не требует написания equals
функции.
Я не Я думаю, что есть какой-то способ избежать жесткого кодирования имени класса где-то здесь, потому что other
приходит как Any, и вы должны привести его к IsTesting
, чтобы иметь доступ к его свойству.