簡體   English   中英

如何從Scala為現有Java類實例調用公共靜態方法?

[英]How to invoke public static method for existing Java class instance from Scala?

盡管圍繞該主題存在很多類似的問題,但我找不到合適的答案。 這是關於常用的構建器+實體方法,例如Apache commons CLI OptionBuilder + Option以及將相應的客戶端代碼遷移到Scala。

代碼示例:

Java類:

public class Entity {

    private int f1;
    private int f2;

    public Entity(int f1, int f2) {
        this.f1 = f1;
        this.f2 = f2;
    }
}

public class Builder {

    private static int f1 = 0;
    private static int f2 = 0;

    private static Builder instance = new Builder();

    static Builder hasF1(int f1) {
        Builder.f1 = f1;
        return Builder.instance;
    }

    static Builder hasF2(int f2) {
        Builder.f2 = f2;
        return Builder.instance;
    }

    static Entity create() {
        return new Entity(Builder.f1, Builder.f2);
    }

}

使用這種方法的普通Java代碼:

Entity entity = Builder.hasF1(5).hasF2(10).create();

如果將它“喂”到了scalac它會抱怨Builder沒有hasF2字段。 從我的調查來看,Scala可以毫無問題地將Builder.hasF1方法定位為class level one但是在此之后,它需要為現有的Java類距離調用static hasF2,這是有問題的。

任何想法應該如何正確解決?

更新:說明所有機制的相關問題: Scala錯誤編譯OptionBuilder

你做不到。 您不能在Scala中的實例上調用靜態方法。 而且,實際上,這在Java中也被認為是不好的做法,但是,如果這是您所擁有的接口,那么除了構建完整的Scala包裝器之外,您實際上無能為力。

現在,如果該代碼在您的控制之下,那么我只能說:不要這樣做。 而且,如果您不信任我,請去看看Joshua Bloch在Effective Java中對此有何評論。

好的,在這種情況下,終於來到了以下Scala解決方案:

Builder.hasF1(5)
Builder.hasF2(10)
Entity entiry = Builder.create()

這清楚地表明原始外部庫的設計不正確。 幸運的是,它在應用程序開始時就被調用了,但是由於潛在的副作用,我正在考慮將這種情況重構為直接的Entity構造函數調用。

static Builder hasF1(int f1) {
    Builder.f1 = f1;
}

不返回任何東西。

因為Builder.hasF1(5)返回任何內容,所以顯然Scala找不到hasF2

修改hasF1:

static Builder hasF1(int f1) {
    Builder.f1 = f1;
    return Builder;
}

並為他人做同樣的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM