I am having a weird problem that I cannot get to the bottom of. I have a class as follows:
public class I18nTextBox extends I18nAbstractTextBox<String> {
public I18nTextBox() {
this("", Consts.MAXL_BASIC);
}
public I18nTextBox(String keyTitle) {
this(keyTitle, Consts.MAXL_BASIC);
}
public I18nTextBox(String keyTitle, int maxLength, String ... substitutions) {
super(keyTitle, maxLength, substitutions);
}
// ...
}
With its superclass defined as follows:
public abstract class I18nAbstractTextBox<T> extends TextBox implements IRefreshableDisplay, IModelDataField<T> {
// some properties ...
public I18nAbstractTextBox() {
this("", Consts.MAXL_BASIC);
}
public I18nAbstractTextBox(String keyTitle) {
this(keyTitle, Consts.MAXL_BASIC);
}
public I18nAbstractTextBox(String keyTitle, int maxLength, String ... substitutions) {
// do some logic
}
//...
}
Eclipse shows no compiler errors whatsoever, yet when I run GWT's debug mode, as soon as it tries to load the app I get a whole load of The constructor I18nTextBox() is undefined errors, every time I instantiate the first class (I18nTextBox
).
It used to be the case that there was just one class, the I18nTextBox
, but we took it, made it abstract and created I18nTextBox
to extend it because we needed a special type of typing, so I know that the class works in its own right.
To summarise:
No-one at work seems to be able to see the problem, does anyone have any idea what might be going on?
So it has been pointed out that a 2 argument constructor is missing, but there are two things to say on this:
String ... substitutions
is an optional argument, so should default to null if not specified.If I go on and specify another constructor, as follows:
public I18nTextBox(String keyTitle, int maxLength) {
this(keyTitle, maxLength, "");
}
Then I fix the error in I18nTextBox
, but get the same error for I18nIntegerTextBox
which is defined in exactly the same way:
public class I18nIntegerTextBox extends I18nAbstractTextBox<Integer> {
public I18nIntegerTextBox() {
this("", Consts.MAXL_BASIC);
}
public I18nIntegerTextBox(String keyTitle) {
this(keyTitle, Consts.MAXL_BASIC);
}
public I18nIntegerTextBox(String keyTitle, int maxLength) {
this(keyTitle, maxLength, "");
}
public I18nIntegerTextBox(String keyTitle, int maxLength, String ... substitutions) {
super(keyTitle, maxLength, substitutions);
}
// ...
}
So I just don't understand what is going wrong!
Ok so we discovered the problem. Essentially the this()
call was confusing the GWT compiler. It wasn't a javac error, but I have a feeling that when GWT was translating the Java into Javascript it was getting confused as to which this()
we were referring to (the superclass or the subclass). The error was a bit cryptic, so I am not entirely sure, but I changed the constructors to all call super()
(with however many arguments is appropriate). The code now looks like this:
public class I18nTextBox extends I18nAbstractTextBox<String> {
public I18nTextBox() {
super();
}
public I18nTextBox(String keyTitle) {
super(keyTitle);
}
public I18nTextBox(String keyTitle, int maxLength, String ... substitutions) {
super(keyTitle, maxLength, substitutions);
}
//...
}
Which fixes the problem, bizarrely.