在Java中实现Scala函数

时间:2014-09-02 12:45:52

标签: java scala scala-java-interop

我正在尝试实现一个scala函数对象(特别是 - 与apache spark一起使用)

等效的java类型是scala.Function0(对于参数少的函数)

除了实现业务逻辑apply()的方法之外,我发现我必须实现其他几种方法。

简单的谷歌搜索方法名称没有帮助(我看到有关应该实现的tag方法的参考 - 但这里的方法名称是不同的。

以下是使用这些方法的代码(使用空实现)。

    private static class functionObject implements Function0<Integer>{

    @Override
    public Integer apply() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public byte apply$mcB$sp() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public char apply$mcC$sp() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public double apply$mcD$sp() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public float apply$mcF$sp() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public int apply$mcI$sp() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public long apply$mcJ$sp() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public short apply$mcS$sp() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void apply$mcV$sp() {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean apply$mcZ$sp() {
        // TODO Auto-generated method stub
        return false;
    }

}

这些方法是什么?它们应该如何实施?是否有一个更清洁的解决方案,将这些添加到任何类?

1 个答案:

答案 0 :(得分:14)

Scalas FunctionX接口是特征,其类型参数是专用的。因为专业化是由scalac完成的,因此不能由javac完成,你必须自己实现与专业化相关的所有内容。

Scala提供了抽象类AbstractFunctionX,可以在Java端轻松实现:

// example Int => Int function
class Z extends scala.runtime.AbstractFunction1<Integer, Integer> {
  public Integer apply(Integer i) {
    return i;
  }
}