java - 如何从 Scala 调用现有 Java 类实例的公共(public)静态方法?

标签 java scala oop static

尽管围绕这个主题有很多类似的问题,但我找不到合适的问题。这是关于常用的构建器 + 实体方法,例如 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/

相关文章:

apache-flex - Flex/ActionScript3 : keyword "with" hides misspelled property names

php - 在类里面使用 $_GET

java - MigLayout 分成 2 行

java - Java将 float 字符串解析为 float 数组?

scala - 有没有办法阻止 Scala 2.12 破坏 Jackson 对象映射器?

scala - 在 Scala 中将一个对象定义为对另外两个对象的操作

Java 字符串替换

java - 图像绘制比其他绘制组件晚半秒

Scala 序列比较

Javascript继承方法重写不起作用