![](/img/trans.png)
[英]How to access a public static final member in a Java class from Scala?
[英]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.