<div dir="ltr">Hello!<div><br></div><div>I'm investigating a seemingly weird compilation case. Consider the following Java interface:</div><div><br></div><div>import java.util.function.Supplier;<br><br>interface Main {<br>    interface X<T> {<br>        X<T> self();<br>    }<br><br>    static X<?> makeX() {return null;}<br><br>    static <R> X<R> create(Supplier<? extends R> supplier) {return null;}<br> <br>    static X<X<?>> methodRef() {<br>        return create(Main::makeX).self();<br>    }<br><br>    static X<X<?>> lambda() {<br>        return create(() -> makeX()).self();<br>    }<br>}</div><div><br></div><div>I expect that either both methods 'methodRef' and 'lambda' should be compilable or both should be non-compilable. However, while 'methodRef' compiles, 'lambda' is rejected by compiler (using javac build 25+36-3489):</div><div><br>Main.java:17: error: incompatible types: X<X<CAP#1>> cannot be converted to X<X<?>><br>        return create(() -> makeX()).self();<br>                                         ^<br>  where CAP#1 is a fresh type-variable:<br>    CAP#1 extends Object from capture of ?<br>1 error<br>error: compilation failed</div><div><br></div><div>Could you please help me and clarify whether this is an expected behavior or not?</div><div><br></div><div>With best regards,</div><div>Tagir Valeev</div></div>