[英]My generic superclass method returns a List of subclass elements how do I Override this method in decendent class to return a List of the subclass
我有一个称为widgets的泛型超类,该超类绑定到<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();
}
}
问题在于Button
类将通用参数固定为Button
。 这意味着合同现在是List<Button> buildWidgets()
。 为了使代码正常工作,您必须以定义Widget
的相同方式定义Button
: Button<T extends Button<?>> extends Widget<T>
。 然后, MobileButton<T extends MobileButton<?>> extends Button<T>
。 您可以省去MobileButton的通用定义,但是如果您想扩展它,就会被困在那里。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.