Неоднозначное разрешение поля @Default в Errai

У меня есть меню с двумя вариантами, и в зависимости от того, какой вариант я выберу, мое приложение должно отображать RepoNavBar или UserNavBar. Эти классы являются потомками NavBar.

У меня есть CommonPage, в котором есть какие-то общие для всего проекта компоненты, и у этого класса есть два потомка RepoCommonPage и UserCommonPage, в которых объявлены RepoNavBar и UserNavBar.

CommonPage использует классы типа ContentComponent следующим образом:

public void setup(CommonPage<?> parentPage) { 
    ...
}

Когда я пытаюсь скомпилировать, я получаю эту ошибку:

Caused by: java.lang.RuntimeException: The following dependency problems were found: [INFO] Ambiguous resolution for field @Default com.client.local.common.ContentComponent in Class @Any @Default com.client.local.usermgt.common.UserCommonPage.

Что может быть не так?

Вот как я делаю:

public abstract class NavBarComponent implements IsElement {

    @Templated(value = "navbar.html#navBtn")
    public static class NavBarItemComponent extends SimpleValueItemComponent<String> {...}
    ...
}
public class RepoNavBarComponent extends NavBarComponent {
     ...
}

public class UserNavBarComponent extends NavBarComponent {
     ...
}

public abstract class CommonPage<T extends ContentComponent> {
     ...
}

public class UserCommonPage<T extends ContentComponent> extends CommonPage<T>{
     ...
}

public class RepoCommonPage<T extends ContentComponent> extends CommonPage<T> { 
     ...
}

ContentComponent вводится следующим образом:

public class UserCommonPage<T extends ContentComponent> extends CommonPage<T>{

    protected UserNavBarComponent userNavBar;

    public UserNavBarComponent getUserNavBar() {
        return userNavBar;
    }

    @PageShown
    public void preparePageShown() {
        log.debug("Page shown");
        userNavBar.refresh();
    }
}

Как вводится ContentComponent в UserCommonPage?

rbarriuso 22.05.2019 16:53

Это как: public class UserCommonPage<T extends ContentComponent> extends CommonPage<T>{ protected UserNavBarComponent userNavBar; public UserNavBarComponent getUserNavBar() { return userNavBar; } @PageShown public void preparePageShown() { log.debug("Page shown"); userNavBar.refresh(); } }

PalomaAS 22.05.2019 17:22

Но я имею в виду @Inject определение ContentComponent в UserCommonPage

rbarriuso 22.05.2019 18:15
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
4
3
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Держу пари, что UserCommonPage (как и другие подобные RepoCommonPage) должно быть abstract.

Кроме того, если этого недостаточно, возможно, вам нужно создать третий промежуточный класс, который расширяет ContentComponent для каждого варианта использования. Например:

 public abstract class UserCommonPage<T extends UserContentComponent> extends CommonPage<T>{

    @Inject
    protected UserNavBarComponent userNavBar;

    public UserNavBarComponent getUserNavBar() {
        return userNavBar;
    }

    @PageShown
    public void preparePageShown() {
        log.debug("Page shown");
        userNavBar.refresh();
    }
}

public class UserContentComponent extends ContentComponent{
   ...
}

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