我似乎无法弄清楚为什么我试图制作的方法调用不起作用.
在问这个问题之前我已经看了很多,虽然有很多关于类似问题的线程,但我找不到一个非常适合我的问题.
我有以下代码:
(在文件Processor.java :)
public interface Processor
{
Runner<? extends Processor> getRunner();
}
Run Code Online (Sandbox Code Playgroud)
(在文件Runner.java :)
public interface Runner<P extends Processor>
{
int runProcessors(Collection<P> processors);
}
Run Code Online (Sandbox Code Playgroud)
(在某些其他文件中,在某些方法中:)
Collection<? extends Processor> processorsCollection = ...;
Runner<? extends Processor> runner = ...;
runner.runProcessors(processorsCollection);
Run Code Online (Sandbox Code Playgroud)
IntelliJ将最后一行标记为错误:
"Runner中的RunProcessors(java.util.Collection>)无法应用于(java.util.Collection>)".
我无法弄清楚我做了什么是错的,特别是因为错误信息不太清楚..有
什么建议吗?
谢谢.
您的收藏和跑步者都可以使用扩展处理器的任何内容.但是,你无法保证它们是一样的.
收藏可能Collection<Processor1>和Runner一样Runner<Processor2>.
无论你需要输入哪种方法(我忘记确切的语法,但我相信你能找到它!)
void <T extends Processor<T>> foo() {
Collection<T> procColl = ...
Runner<T> runner = ...
runner.runProc(procColl);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
@newAcct提出了一个很好的观点:你需要对你的处理器进行泛化(这是一个字吗?).我已更新上面的代码段,以反映这一重要更改.
public interface Processor<P extends Processor>
{
Runner<P> getRunner();
}
public interface Runner<P extends Processor<P>>
{
int runProcessors(Collection<P> processors);
}
Run Code Online (Sandbox Code Playgroud)