Конструктор не нашел ошибок при компиляции
У меня странная проблема, от которой я не могу разобраться. У меня есть класс следующим образом:
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);
}
// ...
}
Его суперкласс определен следующим образом:
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 не показывает никаких ошибок компилятора, но когда я запускаю режим отладки GWT, как только он пытается загрузить приложение, я получаю полную загрузку . Конструктор I18nTextBox() - это неопределенные ошибки, каждый раз, когда я создаю экземпляр первого класса (I18nTextBox
).
Раньше было так, что был только один класс, I18nTextBox
, но мы взяли это, сделали это абстрактным и создали I18nTextBox
расширить его, потому что нам нужен был особый тип набора текста, поэтому я знаю, что класс работает сам по себе.
Чтобы подвести итог:
- Конструктор определяется как в подклассе, так и в суперклассе.
- Затмение не видит ничего плохого.
- Когда проект компилируется компилятором GWT, я получаю множество ошибок "конструктор не найден".
Никто на работе, кажется, не в состоянии увидеть проблему, кто-нибудь имеет какие-либо идеи, что может происходить?
Обновить
Таким образом, было отмечено, что отсутствует конструктор с двумя аргументами, но есть две вещи, которые можно сказать по этому поводу:
- Аргумент
String ... substitutions
является необязательным аргументом, поэтому по умолчанию должен быть равен нулю, если не указан. - это работало раньше, когда был только I18nTextBox и не было абстрактного суперкласса (мы абстрагировались, как описано выше).
Если я продолжу и укажу другой конструктор, как показано ниже:
public I18nTextBox(String keyTitle, int maxLength) {
this(keyTitle, maxLength, "");
}
Тогда я исправляю ошибку в I18nTextBox
, но получите ту же ошибку для I18nIntegerTextBox
который определяется точно так же:
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);
}
// ...
}
Так что я просто не понимаю, что происходит не так!
1 ответ
Итак, мы обнаружили проблему. По сути this()
вызов сбил с толку компилятор GWT. Это не было ошибкой javac, но у меня есть ощущение, что, когда GWT переводил Java на Javascript, он не понимал, какой this()
мы имели в виду (суперкласс или подкласс). Ошибка была немного загадочной, поэтому я не совсем уверен, но я изменил конструкторы на все вызовы super()
(с любым количеством аргументов уместно). Код теперь выглядит так:
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);
}
//...
}
Что решает проблему, причудливо.