【发布时间】:2017-08-22 01:58:47
【问题描述】:
这与java通用通配符有关。我需要了解这是如何发生的并需要解决方案。
例如:我有一个接口名称处理器。
public interface Processer<X> {
<P> void process(P parent, X result);
}
我想将 P 作为通配符。但定义时不允许使用通配符(?)。
当我实现这个接口并让 IDE 生成实现的方法时,它生成如下。
public class FirstProcesser implements Processer<String> {
@Override
public <P> void process(P parent, String result) {
}
}
我想修改这个实现。
public class FirstProcesser implements Processer<String> {
@Override
public void process(User parent, String result) {
}
}
但是它给出了 FirstProcesser 应该是抽象的或实现所有抽象方法的编译错误。
我需要知道为什么会发生这种情况以及解决方案。
【问题讨论】:
-
似乎很明显为什么它正在发生。
User和P不是(不一定)相同的类型,因此它是无效的覆盖。如果你想要一个解决方案,你需要更清楚你想要完成的事情。 -
因为 P 代表通用 P 可以是任何东西。我说的对吗?
-
从某种意义上说,您可以使用任何特定的
P调用它。并不是说你可以用任何P覆盖它。 -
如果你有
Processor<String> processor = ...,值可以是FirstProcessor,SecondProcessor,等等...如果我们要调用processor.process(..., ""),那么强制第一个参数是@987654332 @?FirstProcessor试图强制执行它,但是如果processor的值从FirstProcessor切换到SecondProcessor,并且SecondProcessor想要接受除User之外的其他值(这可能是你这样做,否则P可能只是User)?这是没有意义的,这就是为什么不允许这样做。 -
感谢您的评论。当我实施诸如责任链模式之类的东西时,这个问题就出现了。所以我已经实现了这是超级类并使用它。然后进程将相关处理器相应地绑定到下一个职责。