我似乎无法弄清楚为什么我尝试进行的方法调用不起作用。
在问这个问题之前我已经四处看了很多,虽然有(很多)关于类似问题的线程,但我找不到一个非常适合我的问题的线程..
我有以下代码:
(在文件 Processor.java:)
public interface Processor
{
Runner<? extends Processor> getRunner();
}
(在 Runner.java 文件中:)
public interface Runner<P extends Processor>
{
int runProcessors(Collection<P> processors);
}
(在其他文件中,在某些方法中:)
Collection<? extends Processor> processorsCollection = ...;
Runner<? extends Processor> runner = ...;
runner.runProcessors(processorsCollection);
IntelliJ 将最后一行标记为错误:
“无法将 Runner 中的 RunProcessors (java.util.Collection>) 应用于 (java.util.Collection>)”。
我无法弄清楚我所做的有什么问题,特别是因为错误信息不是很清楚..
有什么建议么?
谢谢。
最佳答案
你的集合和你的运行者都允许任何扩展处理器的东西。但是,您不能保证它们是相同的。
集合可能是 Collection<Processor1>
亚军是Runner<Processor2>
.
无论你有什么方法都需要输入(我忘记了确切的语法,但我相信你能找到它!)
void <T extends Processor<T>> foo() {
Collection<T> procColl = ...
Runner<T> runner = ...
runner.runProc(procColl);
}
编辑:
@newAcct 提出了一个很好的观点:您需要通用化(这是一个词吗?)您的处理器。我更新了上面的代码片段以反射(reflect)这一重要变化。
public interface Processor<P extends Processor>
{
Runner<P> getRunner();
}
public interface Runner<P extends Processor<P>>
{
int runProcessors(Collection<P> processors);
}
关于java泛型 - 参数不能应用于方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7636579/