gpt4 book ai didi

generics - 为什么不能从构造函数推断出 Kotlin 父类(super class)型参数?

转载 作者:行者123 更新时间:2023-12-04 15:49:50 26 4
gpt4 key购买 nike

在 Kotlin 中,如果我们有一个带构造函数的类:

open class Wrapper<T>(val value: T)

我们可以在不指定类型参数的情况下调用构造函数:
val wrapped = Wrapper("value")

指定类型参数(例如 Wrapper<String>("value") )是多余的,IntelliJ 会告诉你。

但是,如果构造函数调用是 extends 子句,则类型参数是必需的。例如。
class StringWrapper : Wrapper<String>("value") // compiles
class StringWrapper : Wrapper("value") // does not compile

为什么在这种看似非常相似的情况下不能推断出类型参数?

最佳答案

在这种情况下当然可以推断出类型参数,但是编译器中还没有代码可以做到这一点。 JetBrains 团队成员 Stanislav Erokhin 对此发表了评论 here在 2017 年。

[...] for now compiler force users declare type arguments for parent class explicitly.



让我们试验一下。编译器源代码中有问题的检查是 here
if (currentArguments.size != currentParameters.size) {
c.trace.report(
WRONG_NUMBER_OF_TYPE_ARGUMENTS.on(
qualifierPart.typeArguments ?: qualifierPart.expression,
currentParameters.size, classifierDescriptorChain[index]
)
)
return null
}

如果我们取消该支票怎么办?原来我们摆脱了
error: one type argument expected for class Wrapper<T>

但我们并没有走得更远;相反,我们得到
error: type arguments should be specified for an outer class 'Wrapper'. Use full class name to specify them

让它发挥作用将需要更大的改变......

所以,简而言之,理论上是可行的,但尚未实现。

关于generics - 为什么不能从构造函数推断出 Kotlin 父类(super class)型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57957408/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com