Oop 可以在Kotlin接口中编写equals方法的默认实现吗?
是否可以在Kotlin接口中编写Oop 可以在Kotlin接口中编写equals方法的默认实现吗?,oop,kotlin,Oop,Kotlin,是否可以在Kotlin接口中编写equals方法的默认实现 我有以下代码: 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
方法的默认实现
我有以下代码:
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'隐藏超类型'Any'的成员并需要'override'修饰符
如果添加覆盖
修改器:
接口不能实现“Any”方法。
原因有点模糊,是从Java继承的(!)
最初,接口只能包含抽象方法(和常量字段)。当添加在接口中指定方法实现的功能时,这样做是为了不破坏现有代码,因此它们仅适用于类尚未实现的情况(在Java中,它们被称为“default”方法以加强这一点。)如果一个类有一个实现,或者在该类中定义,或者在一个超类中定义,那么该实现将被使用,默认值将被忽略
不过也有一些极端情况:在(Java的Kotlin的等价物)中定义的方法是、、(这些方法中的大多数现在很少直接使用,但当然equals()
,hashCode()
,和toString()
非常重要。)
因为这些方法是在Object
中定义的,所以每个类都有它们的直接实现(来自Object
或某些子类),因此永远不能使用接口的默认实现
同样的情况也适用于Kotlin/JVM和Any
中定义的相应方法-事实上,如果您试图提供这些方法中任何一种的默认实现,编译器会给出一个错误,从而使其显式化,如上所示
这是一个遗憾,因为在某些情况下,equals()
、hashCode()
和/或toString()
的默认实现将非常有用!但它会带来复杂性、脆弱性和一些令人惊讶的情况;请参阅以获得权威性解释