Java 我的泛型超类方法返回子类元素的列表如何在Decent类中重写此方法以返回子类的列表

Java 我的泛型超类方法返回子类元素的列表如何在Decent类中重写此方法以返回子类的列表,java,generics,Java,Generics,我有一个名为widgets的泛型超类,它绑定到上。问题是按钮类将泛型参数固定为按钮。这意味着契约现在是listbuildwidgets()。 要使代码正常工作,您必须定义按钮,定义方式与定义小部件相同:按钮>扩展按钮。你可以省去MobileButton的一般定义,但是如果你想扩展它,你就会被困在那里。问题是按钮类将一般参数固定为按钮。这意味着契约现在是listbuildwidgets()。 要使代码正常工作,您必须定义按钮,定义方式与定义小部件相同:按钮>扩展按钮。你可以省去MobileButt

我有一个名为widgets的泛型超类,它绑定到
上。问题是
按钮
类将泛型参数固定为
按钮
。这意味着契约现在是
listbuildwidgets()

要使代码正常工作,您必须定义
按钮
,定义方式与定义
小部件
相同:
按钮>扩展按钮
。你可以省去MobileButton的一般定义,但是如果你想扩展它,你就会被困在那里。

问题是
按钮
类将一般参数固定为
按钮
。这意味着契约现在是
listbuildwidgets()

要使代码正常工作,您必须定义
按钮
,定义方式与定义
小部件
相同:
按钮>扩展按钮
。你可以省去MobileButton的一般定义,但是如果你想扩展它,你就会被困在那里。

谢谢,这修复了编译错误。但是我仍然在WidgetImplementer中得到一个原始类型警告,除非我将按钮声明为ButtonRawType警告,因为Button现在是泛型类型。只需编写
按钮
,就可以将其用作原始类型。在您的情况下,您实际上需要
按钮
,这仍然可能会给您一个rawType警告。如果是的话,你的写作方式是唯一正确的方式。顺便说一句:如果有效,请接受正确的答案;)谢谢,这修复了编译错误。但是我仍然在WidgetImplementer中得到一个原始类型警告,除非我将按钮声明为ButtonRawType警告,因为Button现在是泛型类型。只需编写
按钮
,就可以将其用作原始类型。在您的情况下,您实际上需要
按钮
,这仍然可能会给您一个rawType警告。如果是的话,你的写作方式是唯一正确的方式。顺便说一句:如果有效,请接受正确的答案;)
//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();

    }
}