gpt4 book ai didi

Scala/Java 互操作性 : How to deal with options containing Int/Long (primitive types)?

转载 作者:行者123 更新时间:2023-12-04 20:11:14 26 4
gpt4 key购买 nike

给定 Scala 中的服务:

class ScalaService {
def process1(s: Option[String], i: Option[Int]) {
println("1: " + s + ", " + i)
}
}

这是从 Java 使用的:
public class Java {
public static void main(String[] args) {
ScalaService service = new ScalaService();

// This works, but it's confusing
{
scala.Option<String> so = scala.Option.apply("Hello");
scala.Option<Object> io = scala.Option.apply((Object) 10);
service.process1(so, io);
}

// Would be OK, but not really nice
{
scala.Option<Object> so = scala.Option.apply((Object) "Hello");
scala.Option<Object> io = scala.Option.apply((Object) 10);
service.process1(so, io); // Does not compile
}

// The preferred way
{
scala.Option<String> so = scala.Option.apply("Hello");
scala.Option<Integer> io = scala.Option.apply(10);
service.process1(so, io); // Does not compile
}

}
}

我想避免以不同的方式对待原始类型和非原始类型。

所以我试图通过添加另一种方法来解决这个问题:
def process2(s: Option[String], i: Option[java.lang.Integer]) {
print("2: ")
process1(s, i.map(v => v.toInt))
}

但这需要方法的不同名称。
由于从调用者的角度来看这可能会令人困惑,是否还有其他可能性?

我使用的是 Scala 2.10.1 和 Java 1.6

最佳答案

方法签名也会有点困惑,但您可以使用模式匹配来处理各种类型 - 例如:

class ScalaService {
def process1(s: Option[String], i: Option[Any]) {
i match {
case Some(i2:Int) => processInternal(s, Some(i2))
case Some(i2:java.lang.Integer) => processInternal(s, Some(i2.intValue))
case _ => processInternal(s, None) // or throw exception if you prefer
}

def processInternal(s:Option[String], i:Option[Int]) {
println("1: " + s + ", " + i)
}
}
}

另外,我不确定从 java 调用,但可能是从 java.lang.Integer 的隐式转换至 Int也可以工作吗?

关于Scala/Java 互操作性 : How to deal with options containing Int/Long (primitive types)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17071061/

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