2012-05-18 144 views
11

对于互操作性,我需要从Java代码传递一个Scala PartialFunction。对于函数(Function1等),我可以使用匿名类型继承AbstractFunction,但对PartialFunction执行相同操作最简单的方法是什么?在Java中实现Scala PartialFunction的最简单方法是什么?

在这种情况下,我很乐意让它成为Java中的一个“完整”函数,显示为所有值定义,但键入为PartialFunction。

回答

9

我会在这里做的是提供的Java接口,在一些公共库(这是不是斯卡拉感知):

//this is Java - in the Java lib 
abstract class PartialTransformer<I, O> { 
    abstract public boolean isDefinedAt(I i); 
    public O transform(I i) { 
     if (isDefinedAt(i)) { 
      return transform0(i); 
     } 
     return null; 
    } 
    abstract protected O transform0(I i); 
} 

然后,在斯卡拉(即Scala库依赖于上面的Java库),转换这样的一个实施一个PartialFunction

//this is scala - in the scala lib 
object MyPartialFunctions { 
    def fromPartialTransformer[I, O](t: PartialTransformer[I, O]) = new PartialFunction[I, O] { 
    def isDefinedAt(i: I) = t isDefinedAt i 
    def apply(i: I) = { 
     val r = t transform i 
     if (r eq null) throw new MatchError 
     else r 
    } 
    } 
} 

然后你的Java代码可以做到这一点:

//This is Java - in your client code 
MyPartialFunctions$.MODULE$.fromPartialTransformer(new PartialTransformer<Integer, String>() { 
    @Override public boolean isDefinedAt(Integer i) { /* */ } 
    @Override protected String transform0(Integer i) { /* */ } 
} 

如果你不喜欢MyPartialFunctions$.MODULE$语法,它可能在Scala库,一个Java类其中隐藏了从您:

//This is Java - in the scala-lib 
public class ScalaUtils { 
    public <I, O> scala.PartialFunction<I, O> toPartialFunction(PartialTransformer<I, O> t) { 
     MyPartialFunctions$.MODULE$.fromPartialTransformer(t); 
    } 
} 

然后你的电话,网站看起来是这样的:

//This is Java - in your client code 
ScalaUtils.toPartialFunction(new PartialTransformer<Integer, String>() { 
    @Override public boolean isDefinedAt(Integer i) { /* */ } 
    @Override protected String transform0(Integer i) { /* */ } 
} 

这涉及到,ahem,几个层面的间接!

+0

我曾考虑在Scala中创建一些包装器/工厂。但是,对于这个项目,我无法在Scala中自己生成任何代码。 – SoftMemes

相关问题