Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java generics - parameters cannot be applied to method

Tags:

java

generics


I can't seem to figure out why a method call I'm trying to make doesn't work.
I've looked much around SO before asking this, and while there are (many) threads about similar problems, I couldn't find one that quite fits my problem..
I have the following code:

(in file Processor.java:)

public interface Processor
{
    Runner<? extends Processor> getRunner();
}

(in file Runner.java:)

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

(in some other file, in some method:)

Collection<? extends Processor> processorsCollection = ...;
Runner<? extends Processor> runner = ...;
runner.runProcessors(processorsCollection);


IntelliJ marks the last line as an error:
"RunProcessors (java.util.Collection>) in Runner cannot be applied to (java.util.Collection>)".
I can't figure out whats wrong with what I did, especially since the error message is not quite clear..

any suggestions?

thanks.

like image 343
user976850 Avatar asked Oct 03 '11 14:10

user976850


1 Answers

Both your collection and your runner allow for anything that extend processor. But, you can't guarantee they're the same.

Collection might be Collection<Processor1> and Runner be Runner<Processor2>.

Whatever method you have that in needs to be typed (I forget the exact syntax, but I'm sure you can find it!)

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

Edit:

@newAcct makes an excellent point: you need to genericize (is that a word?) your Processor. I've updated my code snippet above as to reflect this important change.

public interface Processor<P extends Processor>
{
    Runner<P> getRunner();
}

public interface Runner<P extends Processor<P>>
{
    int runProcessors(Collection<P> processors);
}
like image 153
corsiKa Avatar answered Oct 25 '22 07:10

corsiKa