Java类型参数是隐藏泛型类型的?

时间:2013-06-27 13:25:08

标签: java generics

我有一个通用类:

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

这是怎么回事?!?为什么错误再各自警告?设置它的正确(语法)方式是什么?

2 个答案:

答案 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) {
        // ...
    }
}