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

标签 java generics


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

(在文件 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/

相关文章:

java - 如何在android中将double转换为string

java - 从 BatchUpdateException 确定每行执行失败的原因

java - 将Akka与现有Java项目集成的示例

c# - 在本地窗口中更改 T 类型 int

java - 泰坦图 : Edge property with Cardinality. 列表? StandardEdge.addProperty() 在哪里?

java - Java反向数组方法是如何工作的?

generics - Java 8 [无法推断类型变量]问题

java - 在 Java 中是否可以应用部分类型参数?

c# - 使用动态类型调用泛型扩展方法

java - 具有通用参数的接口(interface) - 无法编译