在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
答案 0 :(得分:2)
方法签名也会有点混乱,但您可以使用模式匹配来处理各种类型 - 如:
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
的隐式转换也可能有效?
答案 1 :(得分:2)
我要测试的解决方案是使用DummyImplicit
,因此我可以为Scala和Java方法使用相同的方法名称:
class ScalaService {
// To be called from Scala
def process(s: Option[String], i: Option[Int])(implicit d: DummyImplicit) {
println("1: " + s + ", " + i)
}
// To be called from Java
def process(s: Option[String], i: Option[java.lang.Integer]) {
print("2: ")
process(s, i.map(v => v.toInt))
}
将像Scala一样使用:
object ScalaService extends App {
val s = new ScalaService()
s.process(Some("Hello"), Some(123))
}
来自Java:
public class Java {
public static void main(String[] args) {
ScalaService service = new ScalaService();
{
scala.Option<String> so = scala.Option.apply("Hello");
scala.Option<Integer> io = scala.Option.apply(10);
service.process(so, io);
}
}
}