繁体   English   中英

我的通用超类方法返回子类元素的列表如何在衰落类中重写此方法以返回子类的列表

[英]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的相同方式定义ButtonButton<T extends Button<?>> extends Widget<T> 然后, MobileButton<T extends MobileButton<?>> extends Button<T> 您可以省去MobileButton的通用定义,但是如果您想扩展它,就会被困在那里。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM