在Kotlin中使用Java Void类型

oxosxuxt  于 2023-03-30  发布在  Kotlin
关注(0)|答案(4)|浏览(184)

我有一个Java函数,由于类型约束,它需要我传递一个Void参数。类似于:

void foo(Void v) {
    // do something
}

现在我想从Kotlin调用这个函数,但是当我像从Java那样用null调用它时,编译器抱怨类型不兼容:

foo(null);

我必须传递什么给这个函数,以便Kotlin编译器接受它?

**更新:**实际代码如下:

fun foo(): Map<String, Void> {
    return mapOf(Pair("foo", null))
}

**更新:**使用null as Void实际上也不行:

kotlin.TypeCastException: null cannot be cast to non-null type java.lang.Void
kcugc4gi

kcugc4gi1#

还没有机会尝试它,但纯粹基于您的异常,以下代码应该可以工作:

fun foo(): Map<String, Void?> {
    return mapOf(Pair("foo", null))
}

说明:Map<String, Void>期望没有null值。但是你创建了一个null值的Pair。人们建议调用需要Voidnull的java方法,据我所知,这应该可以工作。但是对于您正在使用的Pair构造函数,您肯定需要显式声明Map可以包含null值。

**编辑:**我的坏necro-ing,没有想到的日期,直到之后。:(

mnemlml8

mnemlml82#

尝试更新您的Kotlin插件。我在'1.0.0-beta-1103-IJ 143 -27'上,以下代码编译时没有任何投诉/警告:

// On Java side
public class Test {
    public void test(Void v) {

    }
}

// On Kotlin side
fun testVoid() {
    Test().test(null)
}
8e2ybdfx

8e2ybdfx3#

我提出了两个解决方案,它们都可以编译(在Kotlin1.1.2-3下)。
你可能需要这个(不改变你的方法签名,但它不起作用):

fun foo(): Map<String, Void> {
  return mapOf(Pair("foo", throw Exception("Why? Why you call me")))
}

或者类似的东西(改变你的签名,它就可以工作了):

fun foo(): Map<String, Void?> {
  return mapOf(Pair("foo", null as Void?))
}

祝你好运。

vwkv1x7d

vwkv1x7d4#

简单的解决办法

companion object {
    private val void = Object()
}

(move当它需要被“保护”时,它会从同伴对象中出来)它并不是一个完全的Void类型,但它同样无用。
我这样使用它是因为我遇到了Collections.synchronizedSet(HashSet())的问题,这是一个偶尔会丢失的项,所以我想试试java.util.concurrent.ConcurrentHashMap。

相关问题