Kotlin中的通用约束,这仅仅是一个方差问题吗?

时间:2019-01-18 13:18:15

标签: generics kotlin interface

我在用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解决方案。

1 个答案:

答案 0 :(得分:1)

这是一个已知问题,您可以投票 https://youtrack.jetbrains.com/issue/KT-17186

作为一种解决方法,您需要声明一个MyClass的继承者,该继承者替换所有类型参数。这样可以解决您的问题。