考虑以下Kotlin代码:
object Domain {
val name = "local"
val location = object {
val city = "Pittsburgh"
val state = "Pennsylvania"
}
}
虽然此定义有效并可编译,但以下代码行失败:
val x = Domain.location.city // Error:(30, 27) Kotlin: Unresolved reference: city
但是,如果我们重写上述定义,如下所示:
object City {
val city = "Pittsburgh"
val state = "Pennsylvania"
}
object Domain {
val name = "local"
val location = City
}
val x = Domain.location.city // works fine
我的问题是:根据语言规范,这真的是正确的行为吗?这看起来并不明智,也不一致。它使得声明复杂的单例对象声明变得不方便,而不是将每个子对象分解为一个顶级声明。当使用此语法时,编译器似乎正在创建匿名类型,然而,当定义在嵌套上下文中时,赋值的类型始终为object
。这几乎看起来像是编译器中的类型推断错误。我遗漏了什么?
发布于 2019-08-23 19:36:27
创建匿名对象所做的就是创建一个类来扩展任何。由于除了超类(在本例中为Any)之外不能给出任何类型信息,因此所有未在该超类中声明的字段都将不可见。
通过创建您的命名对象栏,将生成类Bar,以及对字段的引用,这就是它们在这种情况下可见的原因。
https://stackoverflow.com/questions/57631164
复制相似问题