Hi all,
i've already reported that issue but it was theoretical because the support of
the record pattern was not integrated into the jdk 19 at that time and i was
not able to explain int clearly. Now that the support is available, this code
should throw a StackOverflow error but it creates a linked list of
MatchException which makes it hard to debug.
Wrapping all exceptions into a runtime exception is not a good idea when you
have recursive calls which is a kind of natural when you have pattern matching,
for me it's a spec issue but i want to be sure.
BTW, the bug here lies in the fact that deconstructing Cons(int value, int
size, RecChain next) calls the accessor size() which itself calls
RecChain::size which is a nice puzzler by itself.
public sealed interface RecChain {
default int size() {
return switch (this) {
case Nil __ -> 0;
case Cons(int value, int size, RecChain next) -> 1 + next.size();
};
}
record Nil() implements RecChain { }
record Cons(int value, int size, RecChain next) implements RecChain {
@Override
public int size() {
return size != -1? size: RecChain.super.size();
}
}
public static void main(String[] args){
RecChain chain = new Nil();
for (var i = 0; i < 100; i++) {
chain = new Cons(i, -1, chain);
}
System.out.println(chain.size());
}
}
regards,
Rémi