Мой универсальный метод суперкласса возвращает список элементов подкласса. Как мне переопределить этот метод в дочернем классе, чтобы вернуть список подкласса - PullRequest
1 голос
/ 15 апреля 2019

У меня есть общий суперкласс, называемый виджетами, который связан с <T extends widgets<?>>. У класса есть метод, который возвращает список определенного подкласса при вызове экземпляром подкласса. Я могу получить это для компиляции без предупреждения для прямых подклассов. Но когда я расширяю подкласс, я не могу заставить его скомпилировать. Я пытаюсь избежать приведения в классы, которые используют подтипы и предупреждения Widget.

Раньше я не писал обобщенных классов, поэтому я не уверен в их реализации. Я предоставил фрагмент кода, чтобы показать структуру кода ниже.

//parent class
package snippets;
import java.util.ArrayList;
import java.util.List;

public abstract class Widget<T extends Widget<?>> {
      public List<T> buildWidgets() {
            List<T> widgets = new ArrayList<T>();

            for (int index = 0; index < 10; ++index) {
                try {
                    @SuppressWarnings("unchecked")
                    T widget = (T) this.getClass()
                                        .newInstance();

                } catch (Exception e) {
                        e.printStackTrace();
                }
            }
            return widgets;
        }
}


```
//Direct subclass
package snippets;

public class Button extends Widget<Button> {

}

```
//Class that extends the subclass
package snippets;

public class MobileButton extends Button {

}

```
//This class implements the above
package snippets;

import java.util.List;

public class WidgetImplementer {

    public WidgetImplementer() {
        Button buttonBuilder = new Button();
        MobileButton mButtonBuilder = new MobileButton();

        //This compiles
        List<Button> buttons = buttonBuilder.buildWidgets();

        //This does not: Type mismatch: cannot convert from List<Button> to List<MobileButton>
        List<MobileButton> mButtons = mButtonBuilder.buildWidgets();

    }
}

1 Ответ

0 голосов
/ 15 апреля 2019

Проблема в том, что класс Button фиксирует универсальный параметр как Button.Это означает, что контракт сейчас List<Button> buildWidgets().Чтобы код работал, вам нужно определить Button таким же образом, как определено Widget: Button<T extends Button<?>> extends Widget<T>.А потом MobileButton<T extends MobileButton<?>> extends Button<T>.Вы можете сэкономить общее определение MobileButton, но тогда вы застрянете там, если захотите его расширить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...