<div dir="ltr"><div style="font-family:monospace" class="gmail_default">Hello Amber Dev Team,<br><br>Someone on StackOverflow raised an excellent question about Pattern-Matching for instanceof, and I would like to get a response from one of you to include in the answer. Here is the link.<br><br><a href="https://stackoverflow.com/questions/77453336/instanceof-pattern-matching-in-java-not-compiling#77453336">https://stackoverflow.com/questions/77453336/instanceof-pattern-matching-in-java-not-compiling#77453336</a><br><br>To summarize, the book that they were reading (Java: The Complete Reference, 12th Edition by Herbert Schildt) had the following quote.<br><br>-----QUOTE_START---- (with minor modifications for readability)<br><br>```java<br>Number myOb = Integer.valueOf(9);<br>int count = 10;<br><br>//                 vv---- Conditional AND Operator<br>if ( (count < 100) && myOb instanceof Integer iObj)<br>{<br><br>    iObj = count;<br><br>}<br>```<br><br>The above fragment compiles because the if block will execute only when both sides of the && are true. Thus, the use of iObj in the if block is valid. However, a compilation error will result if you tried to use the & rather than the &&, as shown below.<br><br>```java<br>Number myOb = Integer.valueOf(9);<br>int count = 10;<br><br>//                 v----- Bitwise Logical AND Operator<br>if ( (count < 100) & myOb instanceof Integer iObj)<br>{<br><br>    iObj = count;<br><br>}<br>```<br><br>In this case, the compiler cannot know whether or not iObj will be in scope in the if block because the right side of the & will not necessarily be evaluated.<br><br>----QUOTE_END----<br><br>When compiling the second example, it is exactly as the author says, we get told that the variable may not necessarily be in scope. Here is the error I get using OpenJDK 22 Early Access.<br><br>```java<br>$ java --version<br>openjdk 22-ea 2024-03-19<br>OpenJDK Runtime Environment (build 22-ea+20-1570)<br>OpenJDK 64-Bit Server VM (build 22-ea+20-1570, mixed mode, sharing)<br><br>$ javac --version<br>javac 22-ea<br><br>$ cat abc.java<br>public class abc<br>{<br><br><br>    public static void main(String[] args)<br>    {<br>    <br>        Number myOb = Integer.valueOf(9);<br>    <br>        int count = 10;<br>    <br>        if ( (count < 100) & myOb instanceof Integer iObj )<br>        {<br>    <br>            iObj = count;<br>    <br>        }<br>    <br>    }<br><br>}<br><br>$ javac abc.java<br>abc.java:15: error: cannot find symbol<br>                iObj = count;<br>                ^<br>  symbol:   variable iObj<br>  location: class abc<br>1 error<br><br>```<br><br>I feel like I have a very good idea of why this might be the case, but I lack the terminology to put it into words correctly. Could someone help me out?<br><br>Thank you for your time and help!<br>David Alayachew</div></div>