我有一个有两个构造函数的类:
@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.
我一直在努力解决这个错误,但收效甚微。我不确定如何委托(delegate)给其他构造函数。
非常感谢任何帮助!
谢谢!
最佳答案
唉,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 来说有点不习惯。
最后,你可以考虑可怕的“选项对象”,其中你的一个构造函数接受一个带有属性的对象,或者一个 JsPropertyMap<Any>
。持有所有可能的值,然后检查巨型构造函数中的空值和类型。我个人避免了这种情况 - 这是我希望通过首先编写 Java 来避免的可怕事情之一。
关于javascript - 使用JsConstructor处理多个构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48614354/