1

我有一个通用类:

public class Widget<COMMAND> {
    // ...
}

所以我可以创建它的实例,例如:

Widget<Fizz> fizzWidget = new Widget<Fizz>();

然后我有一个 ABC BaseWidgetProcessor,我想接受Widget任何类型的 s :

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

这里发生了什么?!?为什么会出现错误,然后是相应的警告?设置它的正确(语法)方法是什么?

4

2 回答 2

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();
}
于 2013-06-27T13:36:00.240 回答
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) {
        // ...
    }
}
于 2013-06-27T13:50:07.700 回答