我的通用超类方法返回了子类元素的列表,我该如何在衰落类中重写此方法以返回子类的列表

时间:2019-04-15 19:25:42

标签: java generics

我有一个绑定到<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 :(得分:0)

问题是Button类将通用参数固定为Button。这意味着合同现在为List<Button> buildWidgets()。 为了使代码正常工作,您必须使用定义Button的相同方式来定义WidgetButton<T extends Button<?>> extends Widget<T>。然后MobileButton<T extends MobileButton<?>> extends Button<T>。您可以省去MobileButton的通用定义,但是如果您想扩展它的话,就会被困在那里。