我有一个名为 widgets 的通用父类(super class),它绑定(bind)到 <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()
。
要使代码正常工作,您必须定义 Button
同样的方式Widget
定义为:Button<T extends Button<?>> extends Widget<T>
。然后MobileButton<T extends MobileButton<?>> extends Button<T>
。您可以省去 MobileButton 的通用定义,但如果您想扩展它,您就会被困在那里。
关于java - 我的通用父类(super class)方法返回子类元素列表如何在后代类中重写此方法以返回子类列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55696028/