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