gpt4 book ai didi

function - Kotlin:覆盖(并指定)通用接口(interface)函数

转载 作者:行者123 更新时间:2023-12-02 13:15:30 24 4
gpt4 key购买 nike

我想使用由它们的实现类指定的通用接口(interface),总而言之,这一切都很好,比如:

interface Remove <E> { fun remove(entity: E) }

class MyHandler : Remove <MyClass> {
override fun remove(entity: MyClass) { */do stuff/* }
}
但是,我有一个案例(到目前为止,期待更多),我希望函数本身是通用的。编写界面完全没有问题:
interface FindByID <E> { fun <K : Serializable> findByID(id: K): E }
我需要 K 是可序列化的,因为这是我需要调用的某些函数的要求。
编译器似乎不同意我的实现尝试。当我这样做时:
override fun <String> findByID(id: String): User {
return someFunction(User::class.java, id) as User
}
我得到两个编译器错误:
  • 不覆盖任何内容
  • id不可序列化

  • 但是,当我删除 override<String>从签名来看,它工作正常。这意味着 String是可序列化的,我的研究也表明了这一点。
    这里似乎有什么问题?
    另外,是的,我知道我可以通过多种方式解决这个问题,比如
  • 使接口(interface)函数接受 Serializable而不是 <K : Serializable>
  • 未指定 K覆盖,但随时待命(myHandler.findByID<String>("myID"))
  • “重新路由”调用,在 MyHandler 中实现(而不是覆盖)一个接受字符串的函数,然后在内部调用覆盖函数

  • 尽管对建议持开放态度,但我对解决方法不太感兴趣,但更愿意了解并(如果可能)解决实际问题,或者至少知道它无法完成,因此我可以在规划时考虑到这一点

    最佳答案

    当前的问题
    使用您当前的 <String> 声明,您并没有像您想象的那样专门化类型参数。你实际上在做的是声明一个恰好被命名为 String 的类型参数。 (与著名的 String 类型无关,只是不幸的名称冲突)。使用语法着色,您应该看到 String这里是类型参数的颜色,与 String 类型的颜色不同。将此名称更改为其他任何名称,您就会意识到困惑。
    因此,如果我们将其重命名为 K ,问题变得很明显:问题 1“不覆盖任何内容”是因为您的泛型类型参数没有相同的 : Serializable约束为 findByID接口(interface)中定义的方法。问题2源于它。
    解决方案

    Also, yes, I know that I could work around this issue in a couple of ways, like

    • not specifying K on override, but on call (myHandler.findByID("myID"))

    这一点实际上是问题的本质,而不是解决方法:在您的接口(interface)中定义一个通用函数实际上使其成为该函数通用的契约(Contract)的一部分。
    实现在这里必须有一个泛型类型参数。
    如何修复它取决于您期望发生的事情。
    如果您可以在实现中使用泛型函数,则保留您声明的接口(interface),但接受实现必须处理 K 的所有可能值,这很可能不是您想要的。
    如果你想在你的实现中定义一个特定的类型, K应该是接口(interface)定义的一部分(不是接口(interface)方法),并且方法本身不应该有类型参数,而只是接受现有的 K从界面:
    interface FindByID<E, K : Serializable> {
    fun findByID(id: K): E
    }

    关于function - Kotlin:覆盖(并指定)通用接口(interface)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64428717/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com