我有一个绑定到<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();
}
}
答案 0 :(得分:0)
问题是Button
类将通用参数固定为Button
。这意味着合同现在为List<Button> buildWidgets()
。
为了使代码正常工作,您必须使用定义Button
的相同方式来定义Widget
:Button<T extends Button<?>> extends Widget<T>
。然后MobileButton<T extends MobileButton<?>> extends Button<T>
。您可以省去MobileButton的通用定义,但是如果您想扩展它的话,就会被困在那里。