gpt4 book ai didi

java - 将 Scala 单位转换为 Java Void

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:06:40 24 4
gpt4 key购买 nike

我有一个 Java 类,它采用 Function[String, Void],类似于 Consumer 功能接口(interface)。我从 Scala 代码调用这个 Java 函数。正如您在下面看到的,我在 Scala 端接受 function: => Unit,因为它等效于 void。当我尝试应用此函数代替 Void 时,会发生返回类型类型不匹配的情况。 .asInstanceOf[Void] 的显式转换也会引发异常。我们如何将 => Unit 转换为 => Void

// Java 
class AcceptFunction {
public void temp(Function<String, Void> f) {
f.apply("Hello");
}
}

// Scala
def temp(f: String => Unit): Unit = {
new AcceptFunction().temp(new Function[String, Void]() {
override def apply(t: String): Void = f(t) // <===== error expecting Void instead of Unit
})
}

最佳答案

显然,

scala> new jfunc.Acceptor().f(s => println(s))
<console>:12: error: type mismatch;
found : Unit
required: Void
new jfunc.Acceptor().f(s => println(s))
^

scala> new jfunc.Acceptor().f { s => println(s) ; null }
hello, world.

你展示的 java 在哪里:

package jfunc;

import java.util.function.*;

public class Acceptor {
public void f(Function<String, Void> g) { g.apply("hello, world."); }
}

确实如此:

scala> :javap -c -
public static final java.lang.Void $anonfun$res0$1(java.lang.String);
Code:
0: getstatic #33 // Field scala/Predef$.MODULE$:Lscala/Predef$;
3: aload_0
4: invokevirtual #37 // Method scala/Predef$.println:(Ljava/lang/Object;)V
7: aconst_null
8: areturn

public $line3.$read$$iw$$iw$();
Code:
0: aload_0
1: invokespecial #39 // Method java/lang/Object."<init>":()V
4: aload_0
5: putstatic #41 // Field MODULE$:L$line3/$read$$iw$$iw$;
8: aload_0
9: new #43 // class jfunc/Acceptor
12: dup
13: invokespecial #44 // Method jfunc/Acceptor."<init>":()V
16: invokedynamic #63, 0 // InvokeDynamic #0:apply:()Ljava/util/function/Function;
21: invokevirtual #67 // Method jfunc/Acceptor.f:(Ljava/util/function/Function;)V
24: getstatic #72 // Field scala/runtime/BoxedUnit.UNIT:Lscala/runtime/BoxedUnit;
27: putfield #74 // Field res0:Lscala/runtime/BoxedUnit;
30: return

关于java - 将 Scala 单位转换为 Java Void,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44171262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com