<html><body><div style="font-family: arial, helvetica, sans-serif; font-size: 12pt; color: #000000"><div>It's a step too far, as you said the rules for shadowing are currently the same for all constructs, let's not try to break that unity.</div><div><br data-mce-bogus="1"></div><div>Your first example already exist with the current construct:<br data-mce-bogus="1"></div><div>  //field i in scope<br data-mce-bogus="1"></div><div>  if (o instanceof Integer) {<br data-mce-bogus="1"></div><div>    Integer i = (Integer)o;<br data-mce-bogus="1"></div><div>    System.out.println(i);  // local variable<br data-mce-bogus="1"></div><div>  } else {<br data-mce-bogus="1"></div><div>     System.out.println(i);  // field<br data-mce-bogus="1"></div><div>  }<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>Furthermore, given that all IDEs colorize differently a local variable access vs a field access, from my experience, it's not a real issue apart for the very beginners.</div><div><br data-mce-bogus="1"></div><div>regards,<br data-mce-bogus="1"></div><div>Rémi<br data-mce-bogus="1"></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>"Gavin Bierman" <gavin.bierman@oracle.com><br><b>À: </b>"amber-spec-experts" <amber-spec-experts@openjdk.java.net><br><b>Envoyé: </b>Vendredi 3 Novembre 2017 11:45:30<br><b>Objet: </b>PM design question: Shadowing<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;"><h3 id="shadowing" style="box-sizing: border-box; margin-bottom: 16px; line-height: 1.43; font-size: 1.25em; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; margin-top: 0px !important;" class="">Shadowing</h3><h3 id="shadowing" style="box-sizing: border-box; margin-bottom: 16px; line-height: 1.43; font-size: 1.25em; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; margin-top: 0px !important;" class=""><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; font-size: 16px; font-weight: normal;" class="">As mentioned in the previous email, Java currently has five constructs that declare fresh variables. All five declare variables under the same shadowing regime: (i) No shadowing of formal parameters, (ii) No shadowing of other locally declared variables, but (iii) shadowing permitted of fields. Thus we would expect pattern variables to shadow fields.</p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; font-size: 16px; font-weight: normal;" class="">But such a decision has some interesting consequences. For example, if we adopt flow-like scoping strategy (c or d in the previous email), then the following code has some subtle behaviour.</p><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.600000381469727px; margin-top: 0px; margin-bottom: 16px; font-weight: normal; font-stretch: normal; line-height: 1.45; padding: 16px; background-color: rgb(247, 247, 247); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal;" class=""><code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; padding: 0px; margin: 0px; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: normal; border: 0px; display: inline; line-height: inherit; word-wrap: normal;" class="">// field i in scope
switch (o) {
    case Integer i : System.out.print(i); // shadows field i
                     break; 
    case T t :       System.out.print(i); // field i
}</code></pre><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; font-size: 16px; font-weight: normal;" class="">Is this too confusing?</p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; font-size: 16px; font-weight: normal;" class="">We could also consider allowing variables to shadow other variables when they are in scope <em style="box-sizing: border-box;" class="">and</em> DU. For example, if we adopt scoping strategy (b) from the previous email - where the scope of a pattern variable is the entire enclosing statement - the following code would be allowed.</p><pre style="box-sizing: border-box; overflow: auto; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.600000381469727px; margin-top: 0px; margin-bottom: 16px; font-weight: normal; font-stretch: normal; line-height: 1.45; padding: 16px; background-color: rgb(247, 247, 247); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: normal;" class=""><code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; padding: 0px; margin: 0px; background-color: transparent; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: normal; border: 0px; display: inline; line-height: inherit; word-wrap: normal;" class="">if (o matches T t) {
    // t in scope and DA
} else {
    // t in scope and DU
    if (o1 matches Integer t) {
        // Integer t shadows T t
    }
}</code></pre><div style="box-sizing: border-box; margin-top: 0px; font-size: 16px; font-weight: normal; margin-bottom: 0px !important;" class="">Should we restrict this new notion of shadowing to pattern variables only, or change it for all variables in Java. Would this be a step too far?</div></h3><br></blockquote></div></div></body></html>