简体   繁体   中英

Ambiguous method call with Lambda in Java

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 an Iterator<T> .

The only way you can have such a conflict is when your lambda expression never completes normally, eg ()->{ throw new RuntimeException(); } ()->{ throw new RuntimeException(); } or ()->{ for(;;); } ()->{ 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, eg Eclipse, make sure you are using the most recent version and file a bug report, if this error still occurs.

I had the same problem with eclipse version 4.4.1
Upgrading to 4.4.2 solved it.

I just encountered the same problem and as brafdlog suggested upgrading to a newer version of eclipse fixed it. Except in my case I was already on 4.4.2 (Spring Tool Suite 3.6.4) and upgraded to the latest Eclipse Neon 4.6.1 fixed it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM