[
https://issues.apache.org/jira/browse/GROOVY-11657?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17950220#comment-17950220
]
Paul King edited comment on GROOVY-11657 at 5/8/25 8:41 AM:
------------------------------------------------------------
This is another variation:
{code:groovy}
public class JEP394 {
public static void main(String[] args) {
List<?> items = List.of("Pi", "Cat", "Camel", 3.14, new ArrayList<>());
for (Object item : items) {
if (item instanceof String s && s.length() < 3) {
System.out.println(s.toUpperCase());
}
if (item instanceof String s && s.length() > 3) {
System.out.println(s.toUpperCase());
}
if (!(item instanceof String s)) {
return;
}
System.out.println(s.equalsIgnoreCase("cAT"));
}
}
}
// PI false true camel false
{code}
Adding this as another case and noting that we don't (currently) support the
not instanceof syntax for the last {{if}} statement: {{item !instanceof String
s}}
Given this is really a Java compatibility feature, I don't think we need this
last case.
was (Author: paulk):
This is another variation:
{code:groovy}
public class JEP394 {
public static void main(String[] args) {
List<?> items = List.of("Pi", "Cat", "Camel", 3.14, new ArrayList<>());
for (Object item : items) {
if (item instanceof String s && s.length() < 3) {
System.out.println(s.toUpperCase());
}
if (item instanceof String s && s.length() > 3) {
System.out.println(s.toUpperCase());
}
if (!(item instanceof String s)) {
return;
}
System.out.println(s.equalsIgnoreCase("Dog"));
}
}
}
// PI false false camel false
{code}
Adding this as another case and noting that we don't (currently) support the
not instanceof syntax for the last {{if}} statement: {{item !instanceof String
s}}
Given this is really a Java compatibility feature, I don't think we need this
last case.
> Improved compatibility for "Support instanceof variable"
> --------------------------------------------------------
>
> Key: GROOVY-11657
> URL: https://issues.apache.org/jira/browse/GROOVY-11657
> Project: Groovy
> Issue Type: New Feature
> Components: class generator, parser-antlr4
> Reporter: Daniel Sun
> Assignee: Eric Milles
> Priority: Minor
> Fix For: 5.0.0-alpha-13
>
>
> Java's pattern matching for {{instanceof}} supports flow-sensitive scoping,
> see:
> * https://stackoverflow.com/a/73749721
> * JLS 6.3.1, "Scope for Pattern Variables in Expressions"
> *
> https://openjdk.org/projects/amber/design-notes/patterns/pattern-match-semantics
> So, for the class below, the variable {{s}} would still be in scope for the
> last {{println}} statement.
> {code:java}
> import java.util.ArrayList;
> import java.util.List;
> public class JEP394 {
> public static void main(String[] args) {
> List<?> items = List.of("Pi", "Cat", 3.14, new ArrayList<>());
> for (Object item : items) {
> if (item instanceof String s && s.length() < 3) {
> System.out.println(s.toUpperCase());
> } else if (item instanceof Number n && n.intValue() < 5) {
> System.out.println(n.doubleValue());
> continue;
> } else {
> if (item instanceof String s) {
> System.out.println(s.toLowerCase());
> } else {
> System.out.println(item);
> }
> continue;
> }
> System.out.println(s);
> }
> }
> }
> // PI Pi cat 3.14 []
> {code}
> Currently we report an error for this case (for both static and dynamic
> natures).
--
This message was sent by Atlassian Jira
(v8.20.10#820010)