У меня есть общий суперкласс, называемый виджетами, который связан с <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();
}
}