Конструктор не нашел ошибок при компиляции

У меня странная проблема, от которой я не могу разобраться. У меня есть класс следующим образом:

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);
    }
    //...
}

Что решает проблему, причудливо.

Другие вопросы по тегам