【问题标题】:Kotlin inline class that implements interface under the hood实现底层接口的 Kotlin 内联类
【发布时间】:2019-12-17 00:38:21
【问题描述】:

在 kotlin vesion 1.3.0 中,开发人员可以使用内联类。

“普通”内联类被承诺在运行时不是真正的对象,而仅在编译时存在以进行类型检查。

例如

inline class MyWrapper(val someString: String)

fun consumeMyWrapper(myWrapper: MyWrapper)

应该编译成java等价于以下:

public void consumeMyWrapper~blabla(String myWrapper) 

但这也有效:

interface A {

    fun doJob(b: B)
}

inline class C(val self: D): A {

    override fun doJob(b: B)
}

所以我想知道这究竟是如何编译的。我不知道bytecode 所以我要求一般原则。

但是,如果这样一个应该实现某个接口的对象在运行时不存在,那么其他人必须实现该接口。它会成为内联类的接收者吗?如果接收者碰巧是不可修改的类型(例如来自其他已经编译的库)会发生什么?

我有这些担忧的原因与我最近偶然发现的一个问题有关。在一个大型项目中,我需要一种更简洁的方式来沟通 Fragment 和 Activity。旧方法只是说activity as? MainActivity,这不是“非常干净”。于是我定义了这个接口:

interface ActivityDelegate {

    val view: View

    val routing: Routing

    interface View {
       // All common view related stuff
    }

    interface Routing {
       // BottomNavigtion related stuff
    }
}

并实现如下:

class MainActivity : Activity(), ActivityDelegate {

    override val view by lazy { MainActivityView(this) }

    override val routing by lazy { MainActivityRouting(this) }
}

internal inline class MainActivityView(val self: MainActivity): ActivityDelegate.View 

internal inline class MainActivityRouting(val self: MainActivity): ActivityDelegate.Routing

我将这种方法与内联类一起使用,将一些逻辑从 MainActivity 中移出并委派职责。

所以我担心在这里设置内联类是否合适。在这种特定场景中使用时会有所不同吗?

【问题讨论】:

    标签: java android kotlin kotlin-inline-class


    【解决方案1】:

    “普通”内联类被承诺在运行时不是真正的对象

    不完全是:

    However, sometimes it is necessary to keep wrappers around. As a rule of thumb, inline classes are boxed whenever they are used as another type.

    具体来说,实现接口的是内联类本身。当您将内联类与接口一起使用时,静态类型正是它被装箱的情况之一(如上面链接的示例所示)。在您的情况下,我相信它会装箱并且您不会从 inline 中获得任何好处。

    【讨论】:

      猜你喜欢
      • 2018-01-29
      • 2016-06-08
      • 2018-01-03
      • 2017-07-07
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 2018-06-25
      • 1970-01-01
      相关资源
      最近更新 更多