我想为类的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?
答案 0 :(得分:1)
我认为我真的没有得到您想要完成的任务。
但是也许以下内容可以帮助您解决问题?
如果您使用
fun <T> foo(b: T) {
//...
和
fun <T> doWithFoo(s: T) {
//...
至少该呼叫将不再无效。