尽管围绕这个主题有很多类似的问题,但我找不到合适的问题。这是关于常用的构建器 + 实体方法,例如 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
field 。根据我的调查,Scala 没有问题可以定位 Builder.hasF1
方法为class level one
但在此之后,它需要为现有的 Java 类实例调用 static hasF2,并且存在问题。
知道如何正确解决这个问题吗?
更新: 说明所有机制的相关问题:Scala error compiling OptionBuilder
最佳答案
你做不到。您无法在 Scala 中的实例上调用静态方法。事实上,这在 Java 中也被认为是一种不好的做法,但如果这就是您拥有的接口(interface),那么除了构建一个完整的 Scala 包装器之外,您真的无能为力。
现在,如果该代码在您的控制之下,那么我只能说:不要这样做。而且,如果您不相信我,请看看 Joshua Bloch 在《Effective Java》中对此有何评论。
关于java - 如何从 Scala 调用现有 Java 类实例的公共(public)静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23412650/