<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<div>Neal,</div><div><br></div><div>Great - look forward to seeing it in openjdk :)</div><div><br></div><div>Here's one more you may want to look into, in case it's symptomatic of something nastier.  This class shouldn't compile anyway, but actually triggers an 'internal error' message...</div><div><br></div><div><br></div><div><div>public class InternalError implements {int=>int}, {String=>String} {</div><div><span class="Apple-tab-span" style="white-space:pre">        </span></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>public int invoke(int i) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>return i;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>public String invoke(String s) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>return s;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>static &lt;T> void foo(T t, {T=>T} fn) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>fn.invoke(t);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>public static void main(String[] args) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>foo(1, new InternalError());</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div>}</div><div><br></div><div><br></div><div><div>InternalError.java:18: internal error; cannot instantiate &lt;T>foo(T,javax.lang.function.OO&lt;? extends T,? super T,? extends java.lang.Nothing>) at InternalError to (int,InternalError)</div><div>                foo(1, new InternalError());</div><div>                   ^</div><div>1 error</div></div></div><div><br></div><div><br></div><div>Regards,</div><div><br></div><div>Mark</div><div><br></div><br><div><div>On 17 May 2008, at 21:19, Neal Gafter wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Mark-<br><br>Thanks for these reports!  I'm currently working on promoting the code base into openjdk, but once that is done I'll start addressing these issues.<br><br>Regards,<br>Neal<br><br>On Sat, May 17, 2008 at 1:08 PM, Mark Mahieu &lt;<a href="mailto:mark@twistedbanana.demon.co.uk">mark@twistedbanana.demon.co.uk</a>> wrote:<br> <div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Here are three classes I'd expect to be considered valid, but which don't compile.  Not sure if I've mentioned any of these previously, apologies if so.<br> <br> <br> 1) Using a closure literal on the rhs of the == and != operators yields an "incomparable types" error:<br> <br> <br> public class IncomparableTypes {<br> <br>    public static void main(String[] args) {<br> <br>        {=> void} block = {=>};<br> <br>        boolean result;<br>        result = {=>} == block;<br>        result = block == {=>};<br>    }<br> }<br> <br> <br> IncomparableTypes.java:9: incomparable types: { => void} and { => void}<br>        result = block == {=>};<br>                         ^<br> 1 error<br> <br> <br> <br> 2) Using a closure literal as the expression operand of the instanceof operator results in an "unexpected type" error:<br> <br> <br> public class UnexpectedType {<br> <br>    public static void main(String[] args) {<br> <br>        boolean result = {=>} instanceof Object;<br>    }<br> }<br> <br> <br> UnexpectedType.java:5: unexpected type<br> found   : { => void}<br> required: reference<br>        boolean result = {=>} instanceof Object;<br>                          ^<br> 1 error<br> <br> <br> <br> 3) Casting a closure literal is also rejected:<br> <br> <br> public class Cast {<br> <br>    public static void main(String[] args) {<br> <br>        foo((Object) {=> "Hello"});<br>    }<br> <br>    static void foo(Object o) { }<br> <br>    static void foo({=>Object} fn) { }<br> }<br> <br> <br> Cast.java:5: ')' expected<br>        foo((Object) {=> "Hello"});<br>                    ^<br> Cast.java:5: not a statement<br>        foo((Object) {=> "Hello"});<br>                      ^<br> Cast.java:5: ';' expected<br>        foo((Object) {=> "Hello"});<br>                                 ^<br> 3 errors<br> <br> <br> <br> Regards,<br><font color="#888888"> <br> Mark<br> <br> <br> </font></blockquote></div><br></blockquote></div><br></body></html>