0

我想从 Java 代码调用foldLeftscala 上的方法:Buffer

    List<Integer> javaList = new ArrayList<>();
    javaList.add(1);
    javaList.add(3);
    javaList.add(5);

    Buffer<Integer> scalaBuffer = JavaConversions.asScalaBuffer(javaList);

    scalaBuffer.foldLeft(0, new Function2<Integer, Integer, Integer>() {
        @Override
        public Integer apply(Integer accumulator, Integer element) {
            return carry + element;
        }
    });

但我收到以下编译器错误:

Multiple markers at this line
- The type new Function2<Integer,Integer,Integer>(){} must implement the 
 inherited abstract method Function2<Integer,Integer,Integer>.apply$mcVDI
 $sp(double, int)
- The type new Function2<Integer,Integer,Integer>(){} must implement the 
 inherited abstract method Function2<Integer,Integer,Integer>.tupled$mcIDD$sp()
- The type new Function2<Integer,Integer,Integer>(){} must implement the 
 inherited abstract method Function2<Integer,Integer,Integer>.tupled$mcVJJ$sp()
- The type new Function2<Integer,Integer,Integer>(){} must implement the 
 inherited abstract method Function2<Integer,Integer,Integer>.apply$mcZDJ
 $sp(double, long)
    .
    .
    .

基本上,我必须实现一大堆我不感兴趣的方法。

从 Java 调用单子上的 foldLeft 方法是否有简单的解决方案?

谢谢,约翰

(使用 Scala 2.10-M5 和 JDK 1.7)

4

2 回答 2

1

根据这个 scala-lang 线程,适当的操作过程可能是扩展scala.runtime.AbstractFunction2而不是直接实现Function2

该线程在scala时间上有点旧,但它可能指向一个解决方案。我承认我自己没有试过。

于 2012-07-25T22:20:36.957 回答
1

您可以尝试扩展AbstractFunction2,而不是实施Function2.

对于 java 编译器,scala trait 只是接口,它不会自动让你实现那些在 trait 中没有抽象的方法。只看接口,所有的方法都是抽象的,就像从 java 中看到的那样。

于 2012-07-25T22:20:37.767 回答