<html><body><div style="font-family: arial, helvetica, sans-serif; font-size: 12pt; color: #000000"><div><br></div><div><br></div><hr id="zwchr" data-marker="__DIVIDER__"><div data-marker="__HEADERS__"><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><b>De: </b>"Brian Goetz" <brian.goetz@oracle.com><br><b>À: </b>"Kevin Bourrillion" <kevinb@google.com>, "Alex Buckley" <alex.buckley@oracle.com><br><b>Cc: </b>"amber-spec-experts" <amber-spec-experts@openjdk.java.net><br><b>Envoyé: </b>Samedi 6 Octobre 2018 00:18:54<br><b>Objet: </b>Re: New JEP: Concise Method Bodies<br></blockquote></div><div data-marker="__QUOTED_TEXT__"><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><br>
    <blockquote cite="mid:CAGKkBksaw_3k7V-SjXqVCDFvp_82mHtX5gmRUpx40QFA+XCioQ@mail.gmail.com">
      <div dir="ltr">
        <div class="gmail_quote">
          <div><br>
          </div>
          <div>Can the expression before the :: refer to any method
            parameters? Of course, it would still expect to pass those
            parameters into the method, so it's <i>weird</i> to have
            the same parameter used in both ways, but does it make sense
            to forbid it?</div>
          <br>
        </div>
      </div>
    </blockquote>
    <br>
    Yes, it makes sense to forbid.  Here's why.  <br>
    <br>
    The framing of<br>
    <br>
        method declaration = behavior literal<br>
    <br>
    is meant to suggest that the thing on the RHS can be computed ONCE,
    and that's the "body" of the method.  Therefore, it should only be
    computable based on what is known in the context of the method
    (static state for static methods, instance state for instance
    method.)  It is not merely a shorthand for "take the method ref,
    turn it into a lambda, and then turn the body of that lambda into a
    method body."  <br>
    <br>
    So the thing on the left of the :: must be something that could be,
    say, the RHS of a field initializer of the appropriate static-ness. 
    </blockquote><div> </div><div>It makes little sense to me, because there is no assignment at runtime (it's not a field assignment), you are providing a rational for the semantics based on the syntax, it's the tail waging the dog.</div><div><br data-mce-bogus="1"></div><div>To answer to Kevin,<br data-mce-bogus="1"></div><div>begin able to decide a strategy with the parameter before delegating is not that uncommon, and the way to write it is</div><div>  void fun(T1 arg1, T2 arg2) = getAStrategyAsAFunction(arg1, arg2)::apply<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>By example, if you want to write a Visitor that does the dispatch at runtime (a poor's man pattern matching), you need to first find the function to call given the class of the parameter and then delegate the call to that function.<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>  public class Visitor {<br>    private final HashMap<Class<?>, Consumer<Object>> map = new HashMap<>();<br>  <br>    public <T> void register(Class<T> type, Consumer<? super T> consumer) -> map.put(type, o -> consumer.accept(type.cast(o)));<br>  <br>    public void call(Object o) = map.get(o.getClass())::accept;<br>  }<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><br>
    <br>
    <blockquote>Now we want to introduce a second way to use
      method references, where that creation/evaluation distinction
      doesn't exist. </blockquote>
    <br>
    Same distinction.  You can think of the creation as happening in
    <init> / <clinit>.  </blockquote><div><br></div><div>Methods are not assigned during <init> / <clinit>. Java is neither Ruby nor JavaScript. Otherwise, why do we need a conversion of a method to a functional interface (the :: operator), we should be able to use the method value directly, the one assigned, right ?<br></div><div><br data-mce-bogus="1"></div><div>[...]<br data-mce-bogus="1"></div><div><br></div><div>The only conclusion of this discussion is that supporting method reference for concise method body seems a very bad idea, because it will make people thinking that methods can be assigned like fields.<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>Rémi<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div></div></div></body></html>