【问题标题】:java generics - parameters cannot be applied to methodjava泛型 - 参数不能应用于方法
【发布时间】:2011-10-04 04:18:15
【问题描述】:


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

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

有什么建议么?

谢谢。

【问题讨论】:

    标签: java generics


    【解决方案1】:

    您的收藏和跑步者都允许任何扩展处理器的东西。但是,你不能保证它们是一样的。

    Collection 可能是 Collection&lt;Processor1&gt;,Runner 可能是 Runner&lt;Processor2&gt;

    无论你有什么方法都需要输入(我忘记了确切的语法,但我相信你能找到它!)

    void <T extends Processor<T>> foo() {
        Collection<T> procColl = ...
        Runner<T> runner = ...
        runner.runProc(procColl);
    }
    

    编辑:

    @newAcct 提出了一个很好的观点:您需要通用化(这是一个词吗?)您的处理器。我更新了上面的代码 sn-p 以反映这一重要变化。

    public interface Processor<P extends Processor>
    {
        Runner<P> getRunner();
    }
    
    public interface Runner<P extends Processor<P>>
    {
        int runProcessors(Collection<P> processors);
    }
    

    【讨论】:

    • 如果他从Processor.getRunner() 得到runner 那么这将行不通
    • @newacct 感谢第二双眼睛。我已经相应地更新了我的答案。
    【解决方案2】:

    你没有把你的情况说清楚,你没有向我们展示任何方法的代码或你如何获取对象,所以我们真的不知道你想做什么。

    您的代码不是类型安全的。正如@glowcoder 所说,没有办法知道Collection 的参数与Runner 的参数相同。如果您认为它们确实相同,那么这是基于您没有向我们展示的代码(即“...”中发生了什么?)

    您编写了ProcessorgetRunner() 方法,其返回类型具有通配符参数。这表示在运行时它会返回一个 Runner 并带有一个它确定的神秘参数,我们不知道。这没有多大意义,可能不是您想要的。

    还取决于您正在做什么,runProcessors 方法可能会采用不太严格的界限。例如,如果您不需要修改集合,可能是&lt;? extends P&gt; 甚至&lt;? extends Processor&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多