gpt4 book ai didi

Java类型参数隐藏了泛型类型?

转载 作者:行者123 更新时间:2023-11-29 03:32:39 25 4
gpt4 key购买 nike

我有一个泛型类:

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();
}

我收到一个语法错误:

Syntax error on token(s), misplaced construct(s)

当我将其更改为:

public abstract class BaseWidgetProcessor<Widget> {
public abstract COMMAND process();
}

错误消失了,但现在我收到编译器警告:

The type parameter Widget is hiding the type Widget

这是怎么回事?!?为什么错误然后相应的警告?设置它的正确(句法)方法是什么?

最佳答案

我想你要找的是:

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

关于Java类型参数隐藏了泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17344445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com