Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Scala中为现有Java类实例调用公共静态方法?_Java_Scala_Oop_Static - Fatal编程技术网

如何从Scala中为现有Java类实例调用公共静态方法?

如何从Scala中为现有Java类实例调用公共静态方法?,java,scala,oop,static,Java,Scala,Oop,Static,尽管围绕这个话题有很多类似的问题,但我找不到合适的答案。这是关于常用的builder+实体方法,如ApacheCommonsCLIOptionBuilder+Option,以及相应的客户端代码迁移到Scala 代码中的插图: Java类: public class Entity { private int f1; private int f2; public Entity(int f1, int f2) { this.f1 = f1;

尽管围绕这个话题有很多类似的问题,但我找不到合适的答案。这是关于常用的builder+实体方法,如ApacheCommonsCLI
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类istance调用静态hasF2,并且存在问题

你知道应该如何妥善解决这个问题吗

更新: 说明所有力学的相关问题:

不返回任何内容

因为
Builder.hasF1(5)
不返回任何内容,显然Scala找不到
hasF2

修改hasF1:

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

对别人也一样。

你不能这样做。不能对Scala中的实例调用静态方法。事实上,这在Java中也被认为是一种不好的做法,但如果这就是您拥有的接口,那么除了构建一个完整的Scala包装器之外,您真的无能为力


现在,如果代码在您的控制之下,那么我只能说:不要这样做。如果你不相信我,那就去看看Joshua Bloch用有效的Java对它说了些什么。

好的,在这种情况下,我们终于找到了以下Scala解决方案:

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

这清楚地表明原来的外部库设计不好。幸运的是,它是在应用程序开始时调用的,但我正在考虑重构这种情况,以支持直接
实体
构造函数调用,因为它可能会产生副作用。

Daniel,感谢您提供我调查的最后一点。这不在我的控制之下。事实上,在准备这个问题时,我终于找到了我的案例的解决方案,而你的观点可能是对一般问题的回答。:-)这是一个重复的地方,我刚才评论说OptionBuilder在trunk上不推荐使用。
Builder.hasF1(5)
Builder.hasF2(10)
Entity entiry = Builder.create()