Java如何让类继承任意父类型?泛型继承编译报错求助
问题解答
为什么泛型继承的写法无法编译?
Java中类的继承关系必须在编译阶段确定具体类型,泛型类型参数T只是编译时的占位符,运行时会被类型擦除为它的上限类型Container。编译器无法将类的父类设定为一个不确定的类型参数,因此public class Custom<T extends Container> extends T这种写法是语法错误,根本无法通过编译。
满足需求的可行方案
你的核心需求是:让Custom类能被赋值给JMenuBar变量,同时保留JMenuBar的方法。这里有两种最直接的方案:
方案1:直接继承JMenuBar(推荐)
沿用你最初的写法即可,完全满足需求:
public class Custom extends JMenuBar { // 自定义逻辑 }
这样JMenuBar menubar = new Custom();可以正常运行,Custom会继承JMenuBar的所有方法,不需要额外处理。
方案2:组合+委托(若不想直接继承)
如果出于某种原因不想让Custom直接继承JMenuBar,而是继承Container,可以通过组合JMenuBar实例+方法委托的方式保留需要的JMenuBar方法:
public class Custom extends Container { // 持有JMenuBar实例作为委托对象 private JMenuBar menuBar = new JMenuBar(); // 委托你需要的JMenuBar方法,比如add(JMenu) public JMenu add(JMenu menu) { return menuBar.add(menu); } // 其他需要的方法同理实现委托... }
注意:这种方案下,Custom不是JMenuBar的子类,因此JMenuBar menubar = new Custom();无法直接编译,除非你让Custom实现JMenuBar对应的所有接口并完成委托,但这会增加大量冗余代码,远不如直接继承简洁。
内容的提问来源于stack exchange,提问作者Matthew Reading
相关产品推荐
相关产品推荐

