2 回答
![?](http://img1.sycdn.imooc.com/545864490001b5bd02200220-100-100.jpg)
TA贡献1836条经验 获得超3个赞
我可能没有很好地解释这一点,但类型C
一次只能是一种类型。当你说 时C extends Chart
,你限制了 C 可以是什么类型,但在一天结束时它只能是这些类型之一。换句话说,任何给定的 InteractiveChart 可能是 Chart 类型的 InteractiveChart 或 SimpleChart 类型的 InteractiveChart,但不能同时是两者。
因此,正如所写的那样,您的第二个构造函数必须采用该确切类型。C extends Chart
也不会意味着“扩展图表任何类”。它的意思是“一个特定的类,它恰好扩展了 Chart”。您会收到编译错误,因为构造函数需要一个类型为 C 的类,但您试图为它提供一个类型为 SimpleChart 的类。C 可能不是 SimpleChart。例如,它可能是一个图表或 SomeOtherChart。
TL; DR:为了需要你的第二个构造“扩展图表任何类”,只需使用Chart
代替C
。:)
public InteractiveChart(Chart chart) { .. }
问题解决了。
当然,这带来了一个更好的问题,您真的需要在这里使用泛型吗?到目前为止,您还没有展示任何需要它的东西。
![?](http://img1.sycdn.imooc.com/54584c5e0001491102200220-100-100.jpg)
TA贡献1796条经验 获得超7个赞
所以,据我了解,您的要求是:
您有某种 GUI 构建器框架,出于某种不幸的原因,它只获取类名或Class<?>实例或诸如此类的东西,并使用无参数构造函数。对于此框架,您希望InteractiveChart<SimpleChart>图表为new SimpleChart().
您还有其他代码可以从更大的灵活性中受益:您想InteractiveChart<C>为不同的图表类型创建实例,而不仅仅是SimpleChart.
我有这个权利吗?
这个问题,那么,是Java不会让你定义构造函数,这只是对InteractiveChart<SimpleChart>-任何构造函数InteractiveChart都必须应用到任意的 C-所以你要定义一个构造任意InteractiveChart<C>简单地假设这C是SimpleChart,这(我希望你会同意)不是在这里做出的一个很好的假设,也不是 Java 支持的假设。
一个简单的解决方法是InteractiveChart<SimpleChart>为您的 GUI 构建器框架创建一个子类来实例化:
public class SimpleInteractiveChart extends InteractiveChart<SimpleChart> {
public SimpleInteractiveChart() {
super(new SimpleChart());
}
}
然后您的 GUI 构建器框架可以使用new SimpleInteractiveChart(),而您的其他代码仍然可以使用InteractiveChart<C>它想要的任何类型参数。
添加回答
举报