是否可以equals
在Kotlin接口中编写方法的默认实现?
我有以下代码:
interface User {
val id: String
}
我希望使用id
属性比较所有实现User的类。像这样:
interface User {
val id: String
fun equals(other: Any?) : Boolean {
//check type and stuff
return id == other.id
}
}
我知道我可以(也许应该)使用抽象类,但是我现在必须处理这种情况。
谢谢
不,恐怕不可能。
如果您尝试使用代码,则编译器会抱怨:
'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(),equals(),finalize(),getClass(),hashCode(),notify(),notifyAll(),toString()和wait()。(多数那些很少直接使用这些天,但当然equals()
,hashCode()
和toString()
是非常重要的。)
因为这些方法是在中定义的Object
,所以每个类都有一个直接的实现(来自Object
或某个子类)。因此,永远无法使用该接口的默认实现。
确实适用于Kotlin / JVM及其中定义的相应方法Any
,实际上,如果您尝试提供任何这些方法的默认实现,则编译器会通过给出错误来使其显式,如上所示。
这是一个耻辱,因为存在这样的情况的默认实现equals()
,hashCode()
和/或toString()
将是非常有用的!但这会带来复杂性,脆弱性和一些令人惊讶的极端情况。请参阅此答案以获取权威解释。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句