好的,这是我的问题:我有一个抽象的超类,它包含一个方法public double[][] extractFeatures(BufferedImage image) throws Exception
。
我想覆盖它(也就是说,在定义子类对象时调用子类的实现)。问题是我正在使用的实现需要像<II extends ImageSingleBand>
这样的原始类型参数化才能正常运行(否则会有错误)。现在签名变为:
public <II extends ImageSingleBand> double[][] extractFeatures(BufferedImage image)
问题是Java编译器给了我一个名字冲突,注意到它有
相同的擦除但不会覆盖它
可能有帮助的一个事实是,当我不使用原始类型参数化时,在子类extractFeatures()
方法中,当代码声明变量时会发生错误:
Class<II> integralType = ...
将其更改为Class<II extends ImageSingleBand> integralType = ...
也无法解决问题。
我知道我可以通过各种方式跳过这个问题:
(a)重命名子类的extractFeatures()
(我可以在我的情况下使用它,我更喜欢更一致的解决方案)
(b)将需要原始类型参数化的所有部分移动到可以在子类extractFeatures()
内调用的另一个函数(这是前一个代码编写者选择的解决方案),
所以我不是要求一个解决方案,而是要澄清情况
我的问题是,如果没有像前面提到的那样使用旁路解决方案或者擦除问题与我联系,是否有办法解决这个问题。
答案 0 :(得分:1)
我建议远离子类,并使用适合此任务的设计模式,如适配器。
Adapter的全部要点是实现某个接口(在你的例子中是参数化方法),它使用不同的接口模块/类/方法来完成实际工作(在你的例子中,是非参数化方法) )。
Adapter的实际实现,是在输入参数的接口之间做任何调整需求,调用实际的实现者,根据输出类型调整结果,并返回结果。
有关详细信息,请访问:Adapter