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)
不,根据规范。调用只能是这些形式:
- 没有接收者的完全合格的呼叫:
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)
归档时间: |
|
查看次数: |
351 次 |
最近记录: |