我从依赖项中获得了两个类,让我们将它们都称为Demo,位于包com.example.a和包com.example.b中.

我想在同一个文件中创建两个扩展函数,以在两个Demo类之间进行转换.

我需要在作用域函数中引用外部this.

我try 了以下两种解决方案,但都没有编译:

1.

import com.example.a.Demo as DemoA
import com.example.b.Demo as DemoB

fun DemoA.toDemoB(): DemoB =
    foo {
       name = this@DemoA.name
    }

fun DemoB.toDemoA(): DemoA =
    foo {
        name = this@DemoB.name
    }
fun com.example.a.Demo.toDemoB(): com.example.a.Demo =
    foo {
       name = this@com.example.a.Demo.name
    }

fun com.example.a.Demo.toDemoA(): com.example.a.Demo =
    foo {
        name = this@com.example.a.Demo.name
    }

推荐答案

限定this不指定类名称,而是指定范围:

fun DemoA.toDemoB(): DemoB = foo {
    name = this@toDemoB.name
}

fun DemoB.toDemoA(): DemoA = foo {
    name = this@toDemoA.name
}

在第一个函数中,this@toDemoB指的是函数toDemoB的接收者(即DemoA对象).您还可以使用this@foo来引用内部作用域,即函数foo的参数接收器.

在第二个函数中,this@toDemoA指的是函数toDemoA的接收者(即DemoB对象).

这里没有冲突.

Kotlin相关问答推荐

DataSnapshot.getValue()未记录的奇怪行为

有没有办法在 jetpack compose 中将 TextField 密码点图标增加得更大?

为什么我的通用Kotlin函数中的这个转换未经判断?

Kotlin 协程:flatMapLatest 什么都不发出

如何在 Jetpack Compose 中启动和停止动画

如何在 Hibernate Panache 中进行部分搜索

Android 在将 androidx 生物识别更新为 1.0.0-alpha04 后崩溃

下拉通知面板时是否可以暂停Android中的任何视频(媒体播放器)应用程序?

Kotlin 协程中的 Dispatchers.Main 和 Dispatchers.Default 有什么区别?

如何在主线程上使用 Kotlin 协程 await()

在 Scaffold Jetpack Compose 内的特定屏幕上隐藏顶部和底部导航器

如何使用 Kotlin Coroutines 使 setOnClickListener debounce 1 秒?

Android Studio 4.0.0 Java 8 库在 D8 和 R8 构建错误中脱糖

如何在 Android Studio 3.1.3 中查看 Kotlin 中有趣的源代码?

Mockito 的 argThat 在 Kotlin 中返回 null

在java代码中使用kotlin库

如何在特定条件下清除jetpack数据存储数据

Android:Exoplayer - ExtractorMediaSource 已弃用

Kotlin内联属性的用例是什么?

Android studio,构建kotlin时出现奇怪错误:生成错误代码