首页 文章

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

提问于
浏览
1

我想在我的类的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和T以及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 回答

  • 1

    我不认为我真的得到了你想要完成的东西 .

    但也许以下可能会帮助您解决问题?

    如果你使用

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

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

    至少这个电话不再无效 .

相关问题