扩展T类型,将T委托给T的任何行为

时间:2018-06-26 04:06:09

标签: kotlin

我想为类的T泛型类型添加一些行为,但是我仍然希望类存在。我希望一个类既是本身,又是T型。例如:

open class Foo(val bar: String)

class Bar(val baz: String) : Foo("bar") {

}

这是一个简单的案例,因为我提前知道了Foo类型。如果我将Foo作为接口,则可以将其方法委托给参数:

interface Foo {
    fun bar() = "bar"
}  

class Bar(val foo: Foo) : Foo by foo {

}

Bar仍然是Foo

但是如果我现在不知道它是什么类型,该怎么办?我希望Bar与Bar一样,并且想到了这样的东西:

class Bar<T>(val t: T) : T by t

但是它不能编译。我想以这种方式使用它:

fun doWithFoo(s: String) {
    print(s)
}

fun unknownFoo() {
    val bar = Bar("baz")
    doWithFoo(bar)
}

这可能是一个奇怪的用例,但这是必要的。我需要它来捕获传递给函数的参数,并对其进行断言,但是我需要函数仍然有效,所以:

fun foo(b: Bar){
    print(b.toString())
}

如果我想为函数foo创建一个参数捕获器,我可以创建一些东西来捕获它

class Capturer<T>(t: T) {
    //code that captures the value and make assertions over it
}

但是该功能将无效:

val capturer = Capturer<Bar>(Bar("X"))
foo(capturer) //Invalid

所以我需要捕获器也要成为酒吧。这样,功能foo仍然有效。

如何使Bar类既是Bar又是通用类型T?

1 个答案:

答案 0 :(得分:1)

我认为我真的没有得到您想要完成的任务。

但是也许以下内容可以帮助您解决问题?

如果您使用

fun <T> foo(b: T) {
  //...

fun <T> doWithFoo(s: T) {
  //...

至少该呼叫将不再无效。