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

Aaron Scott-Boddendijk talden at gmail.com
Mon Jun 9 11:50:03 UTC 2025


I'd encourage them to flatten the if-else chain when true-bodies don't
complete normally (throwing or returning)

static void ensureCapacity(List l) {
  if (l instanceof LinkedList) {
    throw new IllegalArgumentException("Use an efficient list
implementation");
  }

  if (!(l instanceof ArrayList al)) {
    return;
  }
  al.ensureCapacity(10);
  System.out.println("done");
}

This is, IMO, simpler to read and reason about.  Simply some number of
'gates' to pass before reaching the work of the method.

And as you add new gates, you don't create churn on the lines for the other
gates (thinking about simpler diffs and clearer git-blame information).

--
Aaron Scott-Boddendijk


On Mon, 9 Jun 2025 at 20:34, Jean-Noël Rouvignac <
jean-noel.rouvignac at pingidentity.com> wrote:

> Yes, I can now see how this matches the spec, and it makes sense.
> Although this could perhaps be a bit surprising to the users, I believe
> the workarounds make for better code anyway.
>
> This reminds me of another case discussed some time ago: effectively final
> assignment over try / catch. It is the same thing here: trying to go above
> and beyond for edge cases can trigger more problems down the line, so we're
> better off not doing it.
>
> Thanks a lot to all of you for taking the time to answer.
>
> Jean-Noël
>
>
> Le lun. 9 juin 2025 à 08:12, Jan Lahoda <jan.lahoda at oracle.com> a écrit :
>
>> 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 <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
>>>>
>>>
>>>
>>> --
>>> [image: 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: [image: Glassdoor logo]
>>> <https://www.glassdoor.com/Overview/Working-at-Ping-Identity-EI_IE380907.11,24.htm>[image:
>>> LinkedIn logo] <https://www.linkedin.com/company/21870>[image: Twitter
>>> logo] <https://twitter.com/pingidentity>[image: YouTube logo]
>>> <https://www.youtube.com/user/PingIdentityTV>[image: 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.*
>>
>>
> *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/ec63bf94/attachment-0001.htm>


More information about the amber-dev mailing list