Kotlin-是否可以推断泛型类型参数?

Kotlin-是否可以推断泛型类型参数?,kotlin,generics,Kotlin,Generics,鉴于此代码: //是否可以推断泛型类型参数? 福班{ 娱乐消费(p:T){ println(“slurp$p”) } } //区域 抽象类ATestsOfFoo(私有valfoo:U){ 趣味测试1(){ foo.consume(someT()) } 抽象乐趣someT():T } 类TestsOfFoo(foo:foo):ATestsOfFoo(foo){ 重写fun someT():字符串{ 回复“你好” } } val testsOfFoo=testsOfFoo(Foo()) testsO

鉴于此代码:

//是否可以推断泛型类型参数?
福班{
娱乐消费(p:T){
println(“slurp$p”)
}
}
//区域
抽象类ATestsOfFoo(私有valfoo:U){
趣味测试1(){
foo.consume(someT())
}
抽象乐趣someT():T
}
类TestsOfFoo(foo:foo):ATestsOfFoo(foo){
重写fun someT():字符串{
回复“你好”
}
}
val testsOfFoo=testsOfFoo(Foo())
testsOfFoo.test1()
//端区
我正在寻找一种从
U
推断
T
类型参数的方法

换言之,我希望能够在不重复
String
作为类型参数的情况下编写以下行:

。。。
//这是我想写的一个例子,它不起作用
类TestsOfFoo(foo:foo):ATestsOfFoo(foo){
...
有没有办法做到这一点

如果没有,是否存在概念上的缺陷,使我们无法从
U
安全地推断
T

附言: 我知道我们可以这样简化ATestsOfFoo:

抽象类ATestsofoo(私有val-foo:foo){
...

但是我不想找它,从概念上讲,
ATestsOfFoo
Foo
进行操作,我想将这些信息保存在类型参数中。

简而言之,不,Kotlin不会根据超级构造函数调用的参数类型推断类型,就像这样。Kotlin的类型推断只支持局部变量推断和函数签名类型推断

您可以在Kotlin规范()

我不确定这里是否存在概念上的缺陷,而且我在类型系统方面没有那么丰富的经验,但我知道这是可以用TypeScript的类型系统推断出来的,但那是因为TypeScript的constrait解算器和类型检查器可以处理泛型的条件类型和默认类型,而Kotlin没有这种语言功能

interface Foo<T> {
  consume(p: T): void
}

interface FooImpl1<U extends Foo<T>, T = U extends Foo<infer X> ? X : never> {
  test(foo: U): T
}

class FooImpl implements FooImpl1<Foo<string>> {
  test(foo: Foo<string>): string { ... }
}
接口Foo{
消耗(p:T):无效
}
接口1{
测试(foo:U):T
}
类FooImpl实现FooImpl1{
测试(foo:foo):字符串{…}
}
总之,对于当前的类型系统Kotlin,我们无法表达这一点。不幸的是,您将不得不重复这些类型