I have defined a static assertThat
method to extend AssertJ. This method accepts a lambda expression of the type:
@FunctionalInterface
public interface Action {
void execute() throws Exception;
}
The signature looks like this:
public static ExceptionAssert assertThat(Action action)
I want to use this method with a static import. But it is ambiguous. The compiler doesn't know whether assertThat(Iterable) or my method should be used. I don't understand how a void
method can conflict with a method that returns an Iterator<T>
.
Any idea how to resolve this conflict (without writing the class name in front of assertThat
)?
You should specify the type of lambda explicitly:
assertThat((Action)() -> {
...
});
The other option is just using the other name, for example, assertNoException
I don't understand how a
void
method can conflict with a method that returns anIterator<T>
.
The only way you can have such a conflict is when your lambda expression never completes normally, e.g. ()->{ throw new RuntimeException(); }
or ()->{ for(;;); }
.
(or if your lambda expression consist of a single method invocation which indeed returns an Iterable
)
For all other cases you are right, there shouldn’t be such a conflict and, indeed I could compile equivalent code without any problems with jdk1.8.0_20
for ordinary lambda expressions (you didn’t include the code which triggers the error in your question).
If you experienced the problem with a lambda expression which can complete normally and have used an older jdk, you ran into the bug discussed here. This answer refers to the language specification part specifying the difference between void
-compatible and value-compatible lambda expressions.
If you used a different compiler or IDE, e.g. Eclipse, make sure you are using the most recent version and file a bug report, if this error still occurs.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With