我想在我的类的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 回答
我不认为我真的得到了你想要完成的东西 .
但也许以下可能会帮助您解决问题?
如果你使用
和
至少这个电话不再无效 .