Javascript 使用JsConstructor处理多个构造函数

Javascript 使用JsConstructor处理多个构造函数,javascript,java,gwt,gwt-jsinterop,Javascript,Java,Gwt,Gwt Jsinterop,我有一个包含两个构造函数的类: @JsType public class Dog implements Animal { String name; public Dog() { this.name = "Scooby Doo"; } public Dog(String name) { this.name = name; } } 在运行gwt compile[使用gwt dev 2.8]时,我遇到了以下错误 [ERRO

我有一个包含两个构造函数的类:

@JsType
public class Dog implements Animal {
    String name;

    public Dog() { 
        this.name = "Scooby Doo";
    }

    public Dog(String name) {
        this.name = name;
    }
}
在运行gwt compile[使用gwt dev 2.8]时,我遇到了以下错误

[ERROR] Constructor 'Dog(String)' can be a JsConstructor only if all constructors in the class are delegating to it.
我一直在努力克服这个错误,但收效甚微。我不知道如何委托给另一个构造函数

非常感谢您的帮助


谢谢

唉,JavaScript不能处理多个构造函数!你只有一个

您可以做一些事情来假装拥有多个数据-您可以检查传入的数据,并指定正常的默认值:

@JsConstructor
public Dog(@JsOptional String name) {
    if (name == null) {
        name = "Scooby Doo";
    }
    this.name = name;
}
如果您的两个构造函数没有在同一位置使用相同的类型,您必须小心这里的类型-明智地使用
instanceof
可能会起作用(请注意,对于JS对象,您使用的是JS
instanceof
,而不是java!)。另一个选项让您更加灵活,但同样,没有重载方法-工厂方法:

public static Dog withName(String name) {
    return new Dog(name);
}
public static Doc defaultImpl() {
    return new Dog();
}

@JsIgnore
public Dog() {/*...*/}
@JsIgnore
public Dog(String name) {/*...*/}
关于同一主题的另一个想法是创建JsType生成器。这对于JS来说没有那么惯用


最后,您可以考虑可怕的“选项对象”,在其中一个构造函数接受一个具有属性的单个对象,或者一个“代码> jsPrimTypMys/CODE >保存所有可能的值,然后检查巨型构造函数中的空值和类型。我个人避免这种情况——这是我希望通过编写Java来避免的可怕事情之一。

我已经处理Java有一段时间了,但我猜它希望所有构造函数最终调用单个实现。类似于
publicdog(){Dog(“scoobydoo”)}