我在用Kotlin编写的项目中创建一些抽象存在一些问题。假设我有一个界面
interface IInterface<A : Any, B> where B : IInterface<A, B> {
fun doSomething(someData: A): B
}
我关心的所有类型B都是它实现IInterface并由此接口的doSomething函数返回。第一个明显的选择是提供B作为通用参数。
我想要实现的是这样的:
class MyClass<A : Any, B>(val value: String) : IInterface<A, B> where B : MyClass<A, B> {
override fun doSomething(someData: A): B = MyClass(someData.toString())
}
其中重写函数返回一个类型受限于类本身类型的对象。
不幸的是,由于某些原因,编译器抱怨重写函数的返回值不是B而是MyClass,即使我将B限制为MyClass类型。 我想念什么吗?可能有任何变魔术吗?
我不明白的原因可能是合理的。但是如何处理呢?
我最有可能遇到的另一个问题是将在Myclass实例之外使用的构造函数。
val aMyClassInstance = MyClass<A, ??? >( "a value" )
我想可以通过Arrow库的一些帮助以Scala方式完成此操作,但首先我想弄清楚是否可以采用不作弊的Kotlin解决方案。
答案 0 :(得分:1)
这是一个已知问题,您可以投票 https://youtrack.jetbrains.com/issue/KT-17186
作为一种解决方法,您需要声明一个MyClass的继承者,该继承者替换所有类型参数。这样可以解决您的问题。