<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><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></body></html>