Реализация нескольких перегруженных интерфейсов с помощью `by` - PullRequest
0 голосов
/ 01 июня 2019

Я бы хотел использовать by для создания API классов.Есть ли способ сделать что-то вроде следующего?

interface Foo<T> {

    fun foo(t: T)
}

inline fun <reified T> createFoo() = object : Foo<T> {

    override fun foo(t: T) {
        // do stuff
    }
}


// This is an error
class StringIntFoo : Foo<String> by createFoo(), Foo<Int> by createFoo()

fun main(){
    val foo = StringIntFoo()
    foo.foo("")
    foo.foo(2)
}


// Doing it manually obviously isn't an issue
class ManualStringIntFoo {

    fun foo(t: String){

    }

    fun foo(t: Int){

    }
}

Ссылка на детская площадка .

Похоже, сгенерированный метод в конечном итоге имеет ту же сигнатуру JVM,Я надеялся, что обретенные типы обойдут это.Только с одной реализацией он работает просто отлично, и типы выглядят правильно.

Есть ли способ сделать это на самом деле?Является ли StringIntFoo технически Foo, я полагаю, не важно для рассматриваемой проблемы.Было бы здорово иметь возможность создавать классы таким образом.

1 Ответ

0 голосов
/ 01 июня 2019

Выполнение этого вручную также не работает, если вы пытаетесь реализовать интерфейсы: ManualStringIntFoo : Foo<String>, Foo<Int> выдает ту же ошибку, что и StringIntFoo.

Так что by не может помочь, потому что все равно компилируется в class StringIntFoo : Foo<String>, Foo<Int>, только устанавливая реализацию методов.

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