Kotlin多平台支持可选的
我正在使用一个Java API,它现在已转换为多平台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.lang.Optional
作为许多调用的返回类型。我知道这是(请参阅),但这是一个现有的API,可选的(对于面向Java的客户机来说,这也是一个不错的选择)。我的问题是怎么做
注意:代码只需向外部API返回Optional.of(x)
或return Optional.empty()
。任何内部使用都将被清除
- 如果可用,我们如何使用real
类Optional
- 有没有一种方法可以避免在非Java目标上重新实现假可选类(即习惯性地使用nullable
后缀)?
静态声明的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)
}
}
}