Eri*_*aas 6 generics type-inference kotlin
在Kotlin中,如果我们有一个带有构造函数的类:
open class Wrapper<T>(val value: T)
Run Code Online (Sandbox Code Playgroud)
我们可以在不指定type参数的情况下调用构造函数:
val wrapped = Wrapper("value")
Run Code Online (Sandbox Code Playgroud)
指定类型参数(例如Wrapper<String>("value"))是多余的,IntelliJ会告诉您。
但是,如果构造函数调用是extend子句,则type参数是必需的。例如
class StringWrapper : Wrapper<String>("value") // compiles
class StringWrapper : Wrapper("value") // does not compile
Run Code Online (Sandbox Code Playgroud)
为什么在这种看似非常相似的情况下无法推断出type参数?
在这种情况下,类型参数当然可以推断出来,但编译器中还没有用于执行此操作的代码。JetBrains 团队成员 Stanislav Erokhin于 2017 年对此发表了评论。
[...] 目前编译器强制用户显式声明父类的类型参数。
让我们尝试一下。编译器源代码中有问题的检查在这里
if (currentArguments.size != currentParameters.size) {
c.trace.report(
WRONG_NUMBER_OF_TYPE_ARGUMENTS.on(
qualifierPart.typeArguments ?: qualifierPart.expression,
currentParameters.size, classifierDescriptorChain[index]
)
)
return null
}
Run Code Online (Sandbox Code Playgroud)
如果我们删除该检查怎么办?原来我们摆脱了
error: one type argument expected for class Wrapper<T>
Run Code Online (Sandbox Code Playgroud)
但我们并没有走得更远;相反我们得到
error: type arguments should be specified for an outer class 'Wrapper'. Use full class name to specify them
Run Code Online (Sandbox Code Playgroud)
让它发挥作用将需要更大的改变......
所以,简而言之,理论上是可以的,但还没有实现。
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |