java - 我的通用父类(super class)方法返回子类元素列表如何在后代类中重写此方法以返回子类列表

标签 java generics

我有一个名为 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/

相关文章:

java - 在模块依赖中声明named的提供方法

generics - 特征上的链接函数

java - 转换为编译时未知的泛型类型

swift - 我可以像使用函数一样创建一个重复的类吗

c# - 使用泛型对象的反射获取属性

java - 如何对包含另一个 jar 文件的 jar 进行签名

java - 如何从 Eclipse 远程运行 Apache Spark?

java - 修改 HTML 和 JSP

java - 在不丢失请求参数的情况下将重定向发送到另一个 servlet/JSP。

ios - 函数中具有相互递归关联类型约束的 Swift 协议(protocol)