可以在没有导入声明的情况下调用 Kotlin 扩展函数吗?

Kol*_*lja 4 kotlin kotlin-extension

是否可以从另一个包调用扩展函数而不导入它?

给定一个扩展函数:

package ext
fun Int.plusOne() = this + 1
Run Code Online (Sandbox Code Playgroud)

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

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

val el: List<Int> = kotlin.emptyList()
Run Code Online (Sandbox Code Playgroud)

我可以实例化类而无需导入:

val str = java.lang.String("yo.")
Run Code Online (Sandbox Code Playgroud)

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

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()
Run Code Online (Sandbox Code Playgroud)

奖励:同样的问题,但针对扩展属性。

编辑:要添加到无效示例列表中,即使在扩展接收者是隐式的地方,也不允许使用 FQDN:

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

// Unresolved reference:
val four = with(3) { ext.plusOne() }
Run Code Online (Sandbox Code Playgroud)

Swe*_*per 5

不,根据规范。调用只能是这些形式:

  • 没有接收者的完全合格的呼叫:package.foo();
  • 具有显式接收者的调用:a.foo();
  • 中缀函数调用:a foo b;
  • 重载的运算符调用:a + b
  • 没有显式接收者的调用:foo().

请注意,“完全限定调用”形式是唯一允许使用包名称的形式,明确表示“没有接收者”。但是,您plusOne需要一个Int作为接收器。事实上,根据定义,所有扩展函数/属性都需要一个接收

我还尝试查看可调用引用,希望plusOne使用完全限定名称创建可调用引用,然后调用该可调用引用。然而,事实证明这些语法更加严格。

ext因此,如果不以某种方式修改包(例如添加“包装器”功能),就无法完成此操作。

毕竟这样的功能确实没有必要。导入并不那么困难——现在 IDE 可以为您完成这一切。如果您需要导入两个同名的东西,请使用导入别名:

import package1.extFunc as pack1ExtFunc
import package2.extFunc as pack2ExtFunc
Run Code Online (Sandbox Code Playgroud)