可以在不导入的情况下从另一个包调用扩展函数吗?

给定一个扩展函数:

package ext
fun Int.plusOne() = this + 1

有没有办法在不先导入函数的情况下调用此函数?

我可以在没有导入的情况下调用非扩展函数(忽略该函数不需要导入,只需注意语法是有效的):

val el: List<Int> = kotlin.emptyList()

我可以在不导入的情况下实例化类:

val str = java.lang.String("yo.")

但我还没有找到对应的扩展(我知道有些例子很愚蠢):

val i = 42
// All those are not valid syntax...

i.ext.plusOne()

ext.plusOne(i)

i.(ext.plusOne)()

i.(ext.plusOne())

ext.i.plusOne()

val pO = ext.plusOne
i.pO()

奖励:同样的问题,但针对的是扩展物业.

编辑:要添加到无效示例列表中,即使在分机接收方是隐式的位置,也不允许使用FQDN:

// Good:
import ext.plusOne
val four = with(3) { plusOne() }

// Unresolved reference:
val four = with(3) { ext.plusOne() }

推荐答案

不,根据spec美元.呼叫只能采用以下形式:

  • 不带听筒的完全合格通话:package.foo()
  • 带有明确接收者的呼叫:a.foo()
  • 中缀函数调用:a foo b
  • 重载运算符调用:a + b
  • 没有明确接收方的呼叫:foo().

请注意,"完全限定调用"表单是唯一允许使用包名的表单,它显式地表示"没有接收者".然而,你的plusOne分需要Int分作为接收者.事实上,根据定义,所有扩展功能/属性都需要接收器by definition.

我还try 查看callable references,希望使用完全限定名称对plusOne进行可调用引用,然后调用该可调用引用.然而,事实证明,它们的语法甚至更严格.

因此,如果不以某种方式修改ext包,比如添加一个"包装器"函数,就无法做到这一点.

毕竟,真的没有必要这样的功能.导入并不是那么难--如今,IDE可以为您完成所有这些工作.如果需要导入两个同名的对象,请使用导入别名:

import package1.extFunc as pack1ExtFunc
import package2.extFunc as pack2ExtFunc

Kotlin相关问答推荐

如何在Jetpack Compose中的列中渲染图像

外键是主键的一部分,但不是索引的一部分.房间

新的jOOQ Gradle插件无法正确处理自引用关系

Kotlin:将泛型添加到列表任何>

如何修改muableStateMapOf的值?

访问者闭包中的Kotlin序列yield 率

如何在Spring Boot中注册新的集合工厂

哪个更好? Integer.valueOf(readLine()) 或 readLine()!!.toInt()

同时也是一个字符串的 Kotlin 枚举

kotlin 父类具有依赖于抽象变量的变量

Kotlin 中的as Long和.toLong()有什么区别?

将 Integer 转换为 Unit 编译成功

从 Kotlin 调用 Java 时可以为空的规则是什么

添加 Kapt 插件后 - 执行 org.jetbrains.kotlin.gradle.internal.KaptExecution 时发生故障

Kotlin - 创建指定长度的随机整数的 ArrayList?

将 Gradle 子元素与 Kotlin 多平台一起使用

如何在 Kotlin 中使用 volatile

如何从定义它们的类外部调用扩展方法?

应用程序在使用 Google Play 服务时遇到问题

递归方法调用在 kotlin 中导致 StackOverFlowError 但在 java 中没有