kotlin - Kotlin 内部类无法解析外部类中声明的扩展函数
问题描述
为什么 Kotlin 中的内部类不能访问外部类中声明的扩展函数,如下所示:
class A{
val a = "as".foo() // LINE 1
class B{
val b = "as".foo() // LINE 2
}
fun String.foo(){}
}
扩展LINE 1
功能已解决,但LINE 2
功能未解决。想知道为什么会有这样的限制?
解决方案
这不是内部类,因为您没有inner
在其上使用关键字。它只是一个嵌套类。如果您熟悉 Java,它就像一个static
内部类。由于它不是inner
,它没有对外部类的任何隐式引用,并且不能对外部类的成员进行裸调用,因为没有使用其成员的特定实例。但是,它可以在外部类的实例上调用外部类的成员,因此您可以例如执行以下操作:
class A{
val a = "as".foo()
class B{
val b = A().run { "as".foo() }
}
fun String.foo(){}
}
即使foo
是扩展函数,它也是 A 的成员,因为它是在哪里声明的。使用使类成为作用域内的接收者的作用域函数是从另一个类调用其成员扩展函数之一的一种方法。
编辑:这是您想要在类中声明扩展的一个原因的示例。
class Sample(val id: Int) {
private val tag = "Sample#$id"
fun String.alsoLogged(): String{
Log.d(tag, this)
return this
}
}
您可以使用此扩展轻松记录您在类中使用的字符串(或者当它是run
or的接收者时apply
)。在类外部声明是没有意义的,因为它使用了该类的私有tag
属性。
推荐阅读
- cpanel - 如何将文件从子域移动到另一个域
- php - PHP 从 MySQL 数据库中选择员工并转换为 JSON
- css - 我必须在 CSS 中选择一个 div 类
- python - docker-registry - 来自 python 的 PUT 请求以 400 响应,但 Curl 工作正常
- javascript - 如何按固定因子缩放 Gatsby 图像?
- javascript - 传递具有动态名称的道具以响应子组件
- elasticsearch - 使用通配符搜索多个字段的 Elastic Search 完全匹配查询
- spring-boot - SpringBoot SOAP 服务:SAAJ SOAP 消息没有正文
- html - 如果数字不断变化,如何在动态表上获取行数
- cassandra - .properties 文件中的 Log4j2 NoSQL Cassandra 配置