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

赫克托

是否可以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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

接口中的默认方法

来自分类Dev

Java接口中的默认方法

来自分类Dev

默认接口中的方法 - Java的

来自分类Dev

是否可以在子类/接口中删除继承的字段/方法?

来自分类Dev

如何实现接口的默认方法?

来自分类Dev

@Override,接口中带有默认方法

来自分类Dev

Java 8接口中的默认方法

来自分类Dev

在接口中实现方法的新组件

来自分类Dev

Kotlin 从已经存在于超类中的接口中实现一个方法

来自分类Dev

是否可以调用实现某个接口的所有对象的方法?

来自分类Dev

Groovy-接口中定义的方法可以具有默认值吗?

来自分类Dev

如何在接口中使用super作为默认实现

来自分类Dev

Java编译器如何检查接口中的所有方法是否都已实现?

来自分类Dev

在接口中实现委托

来自分类Dev

为协议实现默认的equals方法

来自分类Dev

在 Android Java/Kotlin 中,实现接口是否可以直接访问嵌套类的局部变量

来自分类Dev

是否可以禁止直接实现接口

来自分类Dev

是否可以禁止直接实现接口

来自分类Dev

随着Java8接口中默认方法的出现,现在可以在Java中使用类适配器

来自分类Dev

我如何构建一个可以实现的系统,接口中的受保护方法会做什么?

来自分类Dev

从内部接口中的默认方法访问实例变量

来自分类Dev

在接口中添加默认和静态方法的原因

来自分类Dev

Java接口中的默认方法不能是静态的吗?

来自分类Dev

是否可以在接口中声明私有函数?

来自分类Dev

Stream <T>接口中的filter()方法的实现在哪里?

来自分类Dev

使用在接口中声明和实现的扩展方法

来自分类Dev

Java-到实现类的接口中的约束方法参数

来自分类Dev

是否可以继承默认的IShellFolder实现?

来自分类Dev

接口中的“默认”表示什么?

Related 相关文章

  1. 1

    接口中的默认方法

  2. 2

    Java接口中的默认方法

  3. 3

    默认接口中的方法 - Java的

  4. 4

    是否可以在子类/接口中删除继承的字段/方法?

  5. 5

    如何实现接口的默认方法?

  6. 6

    @Override,接口中带有默认方法

  7. 7

    Java 8接口中的默认方法

  8. 8

    在接口中实现方法的新组件

  9. 9

    Kotlin 从已经存在于超类中的接口中实现一个方法

  10. 10

    是否可以调用实现某个接口的所有对象的方法?

  11. 11

    Groovy-接口中定义的方法可以具有默认值吗?

  12. 12

    如何在接口中使用super作为默认实现

  13. 13

    Java编译器如何检查接口中的所有方法是否都已实现?

  14. 14

    在接口中实现委托

  15. 15

    为协议实现默认的equals方法

  16. 16

    在 Android Java/Kotlin 中,实现接口是否可以直接访问嵌套类的局部变量

  17. 17

    是否可以禁止直接实现接口

  18. 18

    是否可以禁止直接实现接口

  19. 19

    随着Java8接口中默认方法的出现,现在可以在Java中使用类适配器

  20. 20

    我如何构建一个可以实现的系统,接口中的受保护方法会做什么?

  21. 21

    从内部接口中的默认方法访问实例变量

  22. 22

    在接口中添加默认和静态方法的原因

  23. 23

    Java接口中的默认方法不能是静态的吗?

  24. 24

    是否可以在接口中声明私有函数?

  25. 25

    Stream <T>接口中的filter()方法的实现在哪里?

  26. 26

    使用在接口中声明和实现的扩展方法

  27. 27

    Java-到实现类的接口中的约束方法参数

  28. 28

    是否可以继承默认的IShellFolder实现?

  29. 29

    接口中的“默认”表示什么?

热门标签

归档