【发布时间】:2020-10-19 13:47:18
【问题描述】:
我想使用由它们的实现类指定的通用接口,总而言之,这一切都很好,比如:
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 是可序列化的,我的研究也表明了这一点。
这里似乎有什么问题?
另外,是的,我知道我可以通过多种方式解决这个问题,比如
- 使接口函数接受
Serializable而不是<K : Serializable> - 不指定
K覆盖,但随时待命 (myHandler.findByID<String>("myID")) - “重新路由”调用,在 MyHandler 中实现(而不是覆盖)一个接受字符串的函数,然后在内部调用被覆盖的函数
虽然我愿意接受建议,但我对解决方法不太感兴趣,但更愿意了解并(如果可能)解决实际问题,或者至少知道它无法完成,因此我可以在规划时考虑到这一点
【问题讨论】:
-
如果我在关注,接口承诺您可以使用 any 类型
K调用该方法 - 但您的实现正试图将其限制为特定类型,这就是不允许的原因。您是否尝试过将类型参数K移动到界面上?然后你可以在实现类中修复它。
标签: function kotlin generics interface overriding