kotlin - Kotlin - 是否可以推断泛型类型参数?
问题描述
鉴于此代码:
// 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) {
...
有没有办法这样做?
如果没有,是否存在概念上的缺陷会阻止我们安全地T
从推断U
?
PS:我知道我们可以这样简化ATestsOfFoo
:
abstract class ATestsOfFoo<T>(private val foo: Foo<T>) {
...
但是我不是在寻找那个,从概念上讲ATestsOfFoo
,Foo<T>
我想将该信息保存在类型参数中。
解决方案
简而言之,不,Kotlin 不会像这样根据超级构造函数调用的参数类型推断类型。Kotlin 的类型推断只支持局部变量推断和函数签名类型推断。
您可以在 Kotlin 规范 ( https://kotlinlang.org/spec/type-in ference.html )中阅读更多相关信息
我不确定这里是否存在概念缺陷,而且我在类型系统方面没有那么经验,但我知道这可以通过 TypeScript 的类型系统推断出来,但这是因为 TypeScript 的约束求解器和类型检查器可以处理泛型的条件类型和默认类型,这不是 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 当前的类型系统,我们无法表达这一点。不幸的是,您只需要重复这些类型。
推荐阅读
- android - 在 OBOE 中打开音频流时字段被覆盖
- java - Java HttpURLConnection Digest Authentication 得到 401
- r - 根据多个条件仅替换列中的某些值
- python - 独立 Jupyter 安装 - Pandas,找不到 tabnine,安装到错误的目录
- excel - VBA For循环工作一次,然后在第二次尝试它会创建一个运行时错误
- swift - IKScannerDeviceViewDelegate 从未调用过
- r - R glm 中的优势比非常高
- html - CSS动画未应用于给定路径
- asp.net-mvc-5 - VS 2019 v16.8 build,MVC 表单和 javascripts 停止工作
- javascript - 反转对象层次结构