Общие ограничения в Котлине, это просто проблема дисперсии? - PullRequest
0 голосов
/ 18 января 2019

У меня есть небольшая проблема с созданием абстракций в моем проекте, написанном на 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" )

Я полагаю, что это можно сделать способом Scala с помощью библиотеки Arrow, но сначала я хотел бы выяснить, возможно ли решение Kotlin без мошенничества.

1 Ответ

0 голосов
/ 18 января 2019

Это известная проблема, вы можете проголосовать за https://youtrack.jetbrains.com/issue/KT-17186

В качестве обходного пути вам нужно объявить наследник MyClass, который заменяет все параметры типа. Это позволит решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...