用`by`实现多个重载接口

时间:2019-06-01 01:14:15

标签: kotlin

我想利用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){

    }
}

链接到playground

看起来生成的方法最终具有相同的JVM签名。我希望经过修饰的类型能够解决它。仅需一个实现,它就可以正常工作并且类型看起来正确。

有某种实际的方法吗?我认为StringIntFoo在技术上是否是Foo对于当前的问题并不重要。能够以这种方式构造类将很酷。

1 个答案:

答案 0 :(得分:0)

如果您尝试实际实现接口,则手动执行也不起作用:ManualStringIntFoo : Foo<String>, Foo<Int>给出与StringIntFoo相同的错误。

因此by无济于事,因为它仍然编译为class StringIntFoo : Foo<String>, Foo<Int>,仅设置方法的实现。