java泛型 - 参数不能应用于方法

use*_*850 4 java generics


我似乎无法弄清楚为什么我试图制作的方法调用不起作用.
在问这个问题之前我已经看了很多,虽然有很多关于类似问题的线程,但我找不到一个非常适合我的问题.
我有以下代码:

(在文件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>)".
我无法弄清楚我做了什么是错的,特别是因为错误信息不太清楚..有

什么建议吗?

谢谢.

cor*_*iKa 8

您的收藏和跑步者都可以使用扩展处理器的任何内容.但是,你无法保证它们是一样的.

收藏可能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)