AN easy example is regular expressions.  We have a class j.u.regex.Pattern, which represents a compiled regex.  A regular expression match is a form of pattern match (there's a match candidate, it is conditional, if it succeeds we extract the capture groups.)  Surely we should expose a "match" pattern on Pattern.

    class Pattern {
        public __inverse String regexMatch(String... groups) {
            Matcher m = matcher(that);
            if (m.matches())
                __yield IntStream.range(1, m.groupCount())
                                    .map(Matcher::group)
.toArray(String[]::new);         }
   }

We match it with an explicit receiver:

    final Pattern As = Pattern.compile("([aA]*)");
    ...
    if (aString instanceof As.regexMatch(String as)) { ... }

Note that even in the regex-like examples, there is still virtual dispatch going on, it's just harder to see because j.u.r.Pattern is a final class.  But if it were an interface, with multiple implementations, then

    case As.regexMatch(String as)

would do a virtual dispatch _on the regex implementation_, and then hand the `String` match candidate to it.

Reply via email to