繁体   English   中英

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

[英]Kotlin - is it possible to infer generics type parameter?

鉴于此代码:

// Can generic type parameter be inferred?
class Foo<T> {
    fun consume(p: T) {
        println("slurp $p")
    }
}

//region
abstract class ATestsOfFoo<U: Foo<T>, T>(private val foo: U) {

    fun test1() {
        foo.consume(someT())
    }

    abstract fun someT(): T
}

class TestsOfFoo(foo: Foo<String>): ATestsOfFoo<Foo<String>, String>(foo) {
    override fun someT(): String {
        return "Hello"
    }
}

val testsOfFoo = TestsOfFoo(Foo())
testsOfFoo.test1()
//endregion

我正在寻找一种从T推断U类型参数的方法。

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

...
// This is an example of what I'd like to be able to write, it does not work
class TestsOfFoo(foo: Foo<String>): ATestsOfFoo<Foo<String>>(foo) {
...

有办法吗?

如果不是,是否存在概念上的缺陷会阻止我们安全地从U推断T

PS:我知道我们可以像这样简化ATestsOfFoo

abstract class ATestsOfFoo<T>(private val foo: Foo<T>) {
...

但是我不是在寻找那个,从概念上讲ATestsOfFooFoo<T>上运行,我想将该信息保留在类型参数中。

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

您可以在 Kotlin 规范 ( https://kotlinlang.org/spec/type-inference.html ) 中阅读更多相关信息

我不确定这里是否存在概念上的缺陷,而且我在类型系统方面经验不足,但我知道这可以通过 TypeScript 的类型系统推断出来,但那是因为 TypeScript 的约束求解器和类型检查器可以使用 generics 的条件类型和默认类型,这不是 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 { ... }
}

综上所述; 使用当前的类型系统 Kotlin 我们无法表达这一点。 不幸的是,您只需要重复这些类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM