【发布时间】:2018-08-01 15:46:24
【问题描述】:
我有一个 InteractiveChart 类,它包装了一个 Chart(接口),并通过将用户交互映射到 Chart 上的 setter 调用来为其添加交互性。
1) 因为Chart 的不同子类可以具有不同的“额外”功能,所以我希望在包装类中有一个getter,它返回包装好的Chart(无需进行未经检查的强制转换!)。我知道这样做的唯一方法是在包装类上使用通用参数。
2) 这个包装类也可以在 NetBeans 的 GUI Builder 中使用,它的限制是它需要一个空的构造函数。但是,泛型参数的运行时类型由实例化它的代码决定,我无法控制 NetBeans 如何实例化它。在这种情况下,我希望它包装 SimpleChart,如果用户想要包装其他东西,他们必须在 GUI 中添加一个 JPanel 占位符,并在用户代码中添加图表。由于相同的约束,我不能在包装类上使用泛型参数。
public class InteractiveChart<C extends Chart> extends JPanel {
private final C wrappedChart;
public InteractiveChart() {
// Compiler error: at this point C can be any other subclass of Chart
this(new SimpleChart());
}
public InteractiveChart(C chart) { wrappedChart = chart; }
public C getWrappedChart() { return wrappedChart; }
}
如何解决1和2之间的困境?
我目前最好的解决方案是创建一个名为InteractiveSimpleChart 的InteractiveChart 的子类,它固定泛型参数。我希望找到一种方法来消除这个子类,因为每次我添加一种新的图表时,我都必须添加一个新的交互包装器。
【问题讨论】:
-
什么是“使用”派对?
-
如果需要无 arg 构造函数,那为什么还要有 1 arg 构造函数呢?泛型的目的是什么?
-
@zhh,他要实例化
new C()。但是他不能这样做,因为你怎么知道 C 有一个无参数的构造函数? -
你需要提供更多关于你想要做什么的信息,因为它很不清楚。但是,据我了解,您应该创建 InteractiveSimpleChart、InteractiveComplexChart、InteractiveWhateverOtherChartsYouHaveChart 并实例化 它们,而不是 Interactive
等。 -
我想这应该可以通过一点反射魔法来实现,但我似乎无法让 type-munging 玩得很好。
标签: java generics gui-builder