我有一个通用类:
public class Widget<COMMAND> {
// ...
}
所以我可以创建它的实例,如:
Widget<Fizz> fizzWidget = new Widget<Fizz>();
然后我有一个ABC BaseWidgetProcessor
,我希望接受任何类型的Widget
:
public abstract class BaseWidgetProcessor<Widget<COMMAND>> {
public abstract COMMAND process();
}
具体的推动力:
public abstract class AstroWidgetProcessor<Widget<COMMAND>> {
@Override
public COMMAND process() {
// ...
}
}
等
问题在于BaseWidgetProcessor
:
public abstract class BaseWidgetProcessor<Widget<COMMAND>> {
public abstract COMMAND process();
}
我收到语法错误:
令牌上的语法错误,错位的构造
当我将其更改为:
public abstract class BaseWidgetProcessor<Widget> {
public abstract COMMAND process();
}
错误消失了,但现在我收到编译器警告:
类型参数Widget隐藏了类型Widget
这是怎么回事?!?为什么错误再各自警告?设置它的正确(语法)方式是什么?
答案 0 :(得分:2)
试试这个:
public abstract class BaseWidgetProcessor<COMMAND> {
protected Widget<COMMAND> widget;
public BaseWidgetProcessor(Widget<COMMAND> widget) {
this.widget = widget;
}
// presumably uses widget
public abstract COMMAND process();
}
答案 1 :(得分:2)
我认为你在寻找的是:
public abstract class BaseWidgetProcessor<W extends Widget<C>, C> {
public abstract C process(W widget);
}
我添加W widget
作为参数,以显示更好的用法。
现在假设您有一个名为CoolWidget的小部件:
public class CoolWidget extends Widget<Integer> {}
要声明CoolWidgetProcessor,您必须这样做:
public class CoolWidgetProcessor extends BaseWidgetProcessor<CoolWidget, Integer> {
@Override
public Integer process(CoolWidget widget) {
// ...
}
}