"Cannot resolve symbol al" after `else if (! (l instanceof ArrayList al))`

Jan Lahoda jan.lahoda at oracle.com
Mon Jun 9 06:12:26 UTC 2025


Hi,


I believe this is what is specified.


Considering:

if (e) S

else T


JLS 6.3.2.2, says that (in some cases), the binding variable from 'e' 
can be introduced to the enclosing scope of the `if`. But I am not aware 
about anything that would say a variable from `T` should be introduced 
to the enclosing scope if the outer `if`.


In the example below, `if (l instanceof LinkedList)` does not introduce 
any binding variables, and hence no binding variable is not introduced 
to the enclosing scope of the `if`.


Please also see:

https://bugs.openjdk.org/browse/JDK-8335402


Jan


On 07. 06. 25 16:55, David Alayachew wrote:
>
> This definitely looks like a bug. Maybe some of the amber folks are 
> busy with Valhalla or something, but I can't see this NOT being a bug.
>
> @Angelos Bimpoudis <mailto:angelos.bimpoudis at oracle.com> poke poke poke
>
>
> On Sat, Jun 7, 2025, 3:14 AM Jean-Noël Rouvignac 
> <jean-noel.rouvignac at pingidentity.com> wrote:
>
>     Hello folks,
>
>     JDK 25 rampdown phase 1 is now behind us, congrats and thanks for
>     all the work done to get there!
>
>     I am reviving this use case to see if anyone agrees that this may
>     be a bug?
>
>     Thank you,
>     Jean-Noel
>
>
>     On Wed, Apr 16, 2025 at 11:37 AM Jean-Noël Rouvignac
>     <jean-noel.rouvignac at pingidentity.com> wrote:
>
>         Hello amber-dev folks!
>
>         While using pattern matching for instanceof I noticed a small
>         incoherent oddity.
>
>         Take this code:
>         ```
>         static void ensureCapacity(List l) {
>           if (l instanceof LinkedList) {
>             throw new IllegalArgumentException("Use an efficient list
>         implementation");
>           } else if (!(l instanceof ArrayList al)) {
>             return;
>           }
>           al.ensureCapacity(10);
>           System.out.println("done");
>         }
>
>         ensureCapacity(new ArrayList());
>         ```
>
>         The compiler rejects this code with: `Cannot resolve symbol 'al'`.
>         (I have tested that code with JDK 24 in the playground
>         (https://dev.java/playground) but also in my IDE with JDK 21)
>
>         However #1, removing the `else` keyword makes the code
>         successfully compile:
>         ```
>           }
>           if (!(l instanceof ArrayList al)) {
>             return;
>           }
>         ```
>
>         However #2, adding an additional `else` keyword makes the code
>         successfully compile:
>         ```
>                 } else if (!(l instanceof ArrayList al)) {
>                     return;
>                 } else {
>                     al.ensureCapacity(10);
>                     System.out.println("done");
>                 }
>         ```
>
>         While option #1 and #2 are acceptable workarounds, it looks to
>         me like there could be a bug in javac? Therefore I am bringing
>         this to your attention so you can decide if it is a bug or not.
>
>         I searched the JDK's bug tracker for this specific case, but
>         could not find anything related.
>
>         Thanks!
>         Jean-Noël
>
>
>
>     -- 
>     Ping Identity <https://www.pingidentity.com/> 	
>     Jean-Noel Rouvignac
>     Senior Principal Software Engineer
>     jean-noel.rouvignac at pingidentity.com
>
>     <https://www.pingidentity.com/en/events/youniverse.html>
>     Connect with us: 	Glassdoor logo
>     <https://www.glassdoor.com/Overview/Working-at-Ping-Identity-EI_IE380907.11,24.htm>LinkedIn
>     logo <https://www.linkedin.com/company/21870>Twitter logo
>     <https://twitter.com/pingidentity>YouTube logo
>     <https://www.youtube.com/user/PingIdentityTV>Blog logo
>     <https://www.pingidentity.com/en/blog.html>
>
>     To view our privacy policy, click here
>     <https://www.pingidentity.com/en/legal/privacy.html>
>     To stop receiving these emails, click here
>     <https://4.pingidentity.com/PreferenceCenter.html>
>
>
>     /CONFIDENTIALITY NOTICE: This email may contain confidential and
>     privileged material for the sole use of the intended recipient(s).
>     Any review, use, distribution or disclosure by others is strictly
>     prohibited.  If you have received this communication in error,
>     please notify the sender immediately by e-mail and delete the
>     message and any file attachments from your computer. Thank you./
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/amber-dev/attachments/20250609/cd9a0a65/attachment-0001.htm>


More information about the amber-dev mailing list