Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 扩展T类型,将其类所需的任何行为委托给T_Kotlin - Fatal编程技术网

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

Kotlin 扩展T类型,将其类所需的任何行为委托给T,kotlin,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

我想给我的类的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

但是如果我现在不知道它是什么类型呢?我希望酒吧和酒吧一样好,我想到了这样的事情:

class Bar<T>(val t: T) : T by t
这可能是一个奇怪的用例,但它是必要的。我需要它捕获传递给函数的参数,并对其进行断言,但我需要函数仍然有效,因此:

fun foo(b: Bar){
    print(b.toString())
}
如果我想为函数
foo
创建一个参数捕获器,我可以创建一些东西来捕获它

class Capturer<T>(t: T) {
    //code that captures the value and make assertions over it
}
类捕获器(t:t){
//捕获值并对其进行断言的代码
}
但是,该函数将变得无效:

val capturer = Capturer<Bar>(Bar("X"))
foo(capturer) //Invalid
val capturer=capturer(Bar(“X”))
foo(capturer)//无效
所以我需要捕获者也成为一个酒吧。这样,函数
foo
仍然有效


我怎样才能使Bar类同时成为Bar和泛型类型T?

我认为我并没有真正实现您想要实现的目标

但也许下面的内容可以帮助你解决问题

如果你使用

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

fundowithfoo(s:T){
//...

至少调用不再无效。

为什么这对您有用?您的用例是什么?用例非常具体。我是为一个测试库而做的,在这个库中,我捕获作为匹配器参数传递的值,例如EqualityMatcher。但是为了使函数保持有效,它必须返回它捕获的类型。我将更新这个问题以包含这个用例我不认为有可能使这个类表现为泛型超类型,但也许有一个我不想看到的替代方案谢谢答案,但这并不完全是我想要的。我需要一个实际上不可能的类,我认为这在当前是不可能的嗯…你知道Mockito吗y已经实现了类似的功能,您可以在(yourObj.yourMethod(ArgumentMatcher.any()/*或特定的一个!!*/)时调用
。也许这就是你想要的?如果是的话,这里有一些来源:我想要的是非常类似的东西,实际上是要添加它,但老实说,
eq
neq
相比有什么问题?你想调整哪个类来实现这个功能?我不确定它是否能与
mock
-按今天的方式编码。
匹配
-方法注意将任何匹配器转换为
T
(内部使用记录器等),因此
匹配
-方法必须是获得否定匹配器的方法。
.not()
-但是,运算符将应用于
T
,这不是您想要的,而是您想要
not()
应用于匹配器。因此:目前这并不能满足您的要求。总而言之,我认为您是对的。没有这样的语言特性可以让类成为
匹配器,同时
T
,但您可能需要构建一些东西来处理它(在我看来,这不值得使用该特性;-))。
fun <T> foo(b: T) {
  //...
fun <T> doWithFoo(s: T) {
  //...