2014-09-02 132 views
8

我想實現一個階函數對象(特別是 - 與Apache火花使用)Scala的功能Java實現

相應的Java類型是scala.Function0(對於參數功能較少)

除了實現業務邏輯apply()的方法,我看到我必須實現其他幾種方法。

簡單的google搜索方法的名稱並沒有幫助(我看到關於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; 
    } 

} 

這些是什麼方法呢?他們是如何應該執行?是有一個更清潔的解決方案,將這些任何類?

+0

也許,但爲什麼你想用Java編寫一個函數階愚蠢的問題?用scala編寫或編寫一個java構造? – nablex 2014-09-02 12:54:04

+0

我想在java項目中使用apache spark。 spark是一個scala項目,所以它期望scala對象。 我們的項目是在java中,所以我不想添加scala代碼。從理論上講,java-scala(特別是java-spark)的互操作性應該相對簡單 - 但顯然有一些問題不是很簡單(或者至少缺少文檔) – 2014-09-02 12:56:08

+0

@Ophiiryoktan Scala - > Java,簡單。 Java - > Scala;變化。很容易,如果scala lib是爲它設計的(!?!)否則是一個醜陋的垃圾 – 2014-09-02 13:10:27

回答

14

Scalas FunctionX接口是@ raits,其類型參數是專門的。因爲專業化是由scalac完成的,因此不能由javac完成,所以你必須自己實現與專業化有關的所有事情。

斯卡拉提供了抽象類AbstractFunctionX,它可以在Java端可以輕鬆實現:

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

好的答案!自從scala 2.7開始,我沒有實現類似的類(儘管沒有專門化),但沒有注意到它們存在。你知道他們何時被介紹嗎? – paradigmatic 2014-09-02 16:28:33

+0

@paradigmatic自2009年12月以來:https://github.com/scala/scala/commit/f2056ddf4518285920db7554f6f93924f3cc3813 – sschaef 2014-09-02 17:51:06