我想利用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对于当前的问题并不重要。能够以这种方式构造类将很酷。
答案 0 :(得分:0)
如果您尝试实际实现接口,则手动执行也不起作用:ManualStringIntFoo : Foo<String>, Foo<Int>
给出与StringIntFoo
相同的错误。
因此by
无济于事,因为它仍然编译为class StringIntFoo : Foo<String>, Foo<Int>
,仅设置方法的实现。