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,我们无法表达这一点。不幸的是,您将不得不重复这些类型