【发布时间】:2018-10-08 08:34:01
【问题描述】:
如果您知道如何运行标题行,只需向下滚动到 tl;dr 或写下答案!
我写了其余的文字以避免XY problem。什么时候完成都无所谓了。
上下文
我想创建一个接受泛型(列表、地图等)的对象。
列表中的对象应满足 2 个条件:
- 拥有
mymethod()(我通过创建一个将此作为方法头的接口实现) - 扩展
JComponent
我是如何做到这一点的:
- 我创建了多个类,其中任何一个都实现了
MyInterface,并且正在扩展一个 JComponent(它的子类)。这就是我在标题问题中遇到的问题:new List<MyInterface extends JComponent); - 另一个想法:创建一个抽象类(符合所有标准)而不是接口。问题:我需要的具体类不扩展同一个类。
- 我想到了泛型,就像:
public abstract class MyClass<X extends JComponent> extends X,但这行不通——原因很明显。 (例如,我必须实现超类的抽象方法,但如果它是泛型,我现在不知道。)
tl;博士
我遇到了一个问题,如果你能让这条线正常工作,这个问题很容易解决:
new List<A extends B>();
或者,由@khelwood 介绍: 新列表();
地点:
- A 是一个接口(就像我可以声明一个
new List<MyInterface>() - 并且任何项目都扩展
? extends B(例如:它可以是 JTextField 或 JTextArea 或任何他们喜欢的,但它必须是 JComponent 的(子类) (JComponent = B))
【问题讨论】:
-
我正在尝试按照您的要求进行操作。你想要一个列表,其中每个项目都扩展
A和B? -
@khelwood 差不多。我希望每个项目都扩展
? extends A(一个 JComponent 或其子类之一)并实现 B。 -
@Asqiir 如果您所说的具体类不扩展同一个类,那么它们如何扩展
JComponent? -
@BartoszKP 如编辑中所述,它们不扩展同一个类,但它始终是 JComponent 的子类(因此他们可以决定 JTextArea 或 JTextField 或 JRadioBox 等)
-
@Asqiir 您对
List<A extends B>的使用会引起混淆。A类型要么扩展B类型,要么不扩展。如果你真的想要一个扩展A&B的类型,那就不是一回事了。
标签: java generics interface abstract-class