Kotlin多平台支持可选的

Kotlin多平台支持可选的,kotlin,kotlin-multiplatform,Kotlin,Kotlin Multiplatform,我正在使用一个Java API,它现在已转换为多平台Kotlin。它过去使用java.lang.Optional作为许多调用的返回类型。我知道这是(请参阅),但这是一个现有的API,可选的(对于面向Java的客户机来说,这也是一个不错的选择)。我的问题是怎么做 注意:代码只需向外部API返回Optional.of(x)或return Optional.empty()。任何内部使用都将被清除 如果可用,我们如何使用realOptional类 有没有一种方法可以避免在非Java目标上重新实现假可选

我正在使用一个Java API,它现在已转换为多平台Kotlin。它过去使用
java.lang.Optional
作为许多调用的返回类型。我知道这是(请参阅),但这是一个现有的API,可选的(对于面向Java的客户机来说,这也是一个不错的选择)。我的问题是怎么做

注意:代码只需
向外部API返回Optional.of(x)
return Optional.empty()
。任何内部使用都将被清除

  • 如果可用,我们如何使用real
    Optional
  • 有没有一种方法可以避免在非Java目标上重新实现假可选类(即习惯性地使用nullable
    后缀)

此时,Kotlin不允许通过使用带有匹配的
静态
声明的Java类,为带有
伴生对象的预期类提供
实际类型别名。请关注此问题以获取更新:

现在,您可以通过在预期的
Optional
类之外单独声明工厂函数来解决这个问题,如下所示:

expect class Optional<T : Any> {
    fun get(): T
    fun isPresent(): Boolean
    /* ... */
}

expect object Optionals {
    fun <T : Any> of(t: T): Optional<T>
    fun empty(): Optional<Nothing>
}
至于不为非JVM平台提供实现,我怀疑这是可能的,因为这需要将
Optional
用法的编译时转换为可空类型。所以你会想要这样的东西:

actual typealias Optional<T> = T?
然后,在此自定义源集中(例如在
src/nonJvmOptional/kotlin/optionalinpl.kt
)可以为非JVM目标提供实际实现


这里有一个关于Github的最小项目示例,我在其中进行了上述实验:

actual typealias Optional=T?
如果它能工作,那将非常棒。@drekbour,据我所知,这几乎是这种类型别名的唯一可行的用例,它将需要非平凡的规则,这就是为什么它被禁止的原因。
actual typealias Optional<T> = T?
kotlin {
    /* targets declarations omitted */

    sourceSets {
        /* ... */

        val nonJvmOptional by creating {
            dependsOn(getByName("commonMain"))
        }
        configure(listOf(js(), linuxX64())) { // these are my two non-JVM targets
            compilations["main"].defaultSourceSet.dependsOn(nonJvmOptional)
        }
    }
}