Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 可以在Kotlin接口中编写equals方法的默认实现吗?_Oop_Kotlin - Fatal编程技术网

Oop 可以在Kotlin接口中编写equals方法的默认实现吗?

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 } } 我知道我可以(也

是否可以在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'隐藏超类型'Any'的成员并需要'override'修饰符

如果添加
覆盖
修改器:

接口不能实现“Any”方法。

原因有点模糊,是从Java继承的(!)

最初,接口只能包含抽象方法(和常量字段)。当添加在接口中指定方法实现的功能时,这样做是为了不破坏现有代码,因此它们仅适用于类尚未实现的情况(在Java中,它们被称为“default”方法以加强这一点。)如果一个类有一个实现,或者在该类中定义,或者在一个超类中定义,那么该实现将被使用,默认值将被忽略

不过也有一些极端情况:在(Java的Kotlin的等价物)中定义的方法是、、(这些方法中的大多数现在很少直接使用,但当然
equals()
hashCode()
,和
toString()
非常重要。)

因为这些方法是在
Object
中定义的,所以每个类都有它们的直接实现(来自
Object
或某些子类),因此永远不能使用接口的默认实现

同样的情况也适用于Kotlin/JVM和
Any
中定义的相应方法-事实上,如果您试图提供这些方法中任何一种的默认实现,编译器会给出一个错误,从而使其显式化,如上所示

这是一个遗憾,因为在某些情况下,
equals()
hashCode()
和/或
toString()
的默认实现将非常有用!但它会带来复杂性、脆弱性和一些令人惊讶的情况;请参阅以获得权威性解释