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

标签 function kotlin generics interface overriding

我想使用由其实现类指定的通用接口(interface),总而言之,这一切都工作正常,例如:

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

class MyHandler : Remove <MyClass> {
   override fun remove(entity: MyClass) { */do stuff/* }
}

但是,我有一个案例(到目前为止,期待更多),我希望函数本身是通用的。写接口(interface)完全没有问题:

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
}

我收到两个编译器错误:

  1. 不覆盖任何内容
  2. 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"))

这一点实际上是问题的本质,而不是解决方法:在界面中定义通用函数实际上使其成为该函数通用的契约(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/

相关文章:

c++ - 无法弄清楚如何通过仅使用类的函数删除整个链表

JAVASCRIPT 这是模拟 sort() 方法的好函数吗?

function - 在 postgresql 中运行函数抛出运行时错误

JavaScript 变量/字符串函数?

c# - 从泛型类派生的类中缺少构造函数

immutability - Kotlin 实例化不可变列表

java - Spring Boot 无法在 IntelliJ 中运行单个测试

java - 来自后台线程的处理程序 postDelayed()

java - Gson 泛型属性

java - 是否可以泛化这个函数?