Pattern matching on Class<T>

Vikram Bakshi vab2048 at gmail.com
Sat Jun 11 12:06:11 UTC 2022


Hello,

Apologies if code formatting does not appear well (I'm not used to mailing
lists). All code blocks are available to view here:
https://stackoverflow.com/questions/72545671/pattern-matching-on-classt

I asked a question on stackoverflow about why we cannot match on Class<T>
in the way I expect. Suppose we have:

    sealed interface Animal permits Dog, Cat, Bear {}
    record Dog() implements Animal {}
    record Cat() implements Animal {}
    record Bear() implements Animal {}

This would work:

    static <T extends Animal> String makeNoise(Class<T> cls) {
        if(cls.equals(Dog.class)) {
            return "WOOF";
        } else if(cls.equals(Cat.class)) {
            return "MEOW";
        } else if(cls.equals(Bear.class)) {
            return "ROAR";
        } else {
            throw new IllegalStateException("Unknown state");
        }
    }

But this wouldn't:

    static <T extends Animal> String makeNoisePatternMatch(Class<? extends
Animal> cls) {
        return switch(cls) {
            case Dog.class c -> "WOOF";
            case Cat.class c -> "MEOW";
            case Bear.class c -> "ROAR";
        };
    }

I got the answer on Stack Overflow that this is not allowed by the spec. My
question to the mailing list is: will the current restriction be lifted in
the future?

Will we be able to pattern match like the above? And if not - how come it
is restricted (I'm  not criticising but rather just asking more out of
curiosity to understand the decision to maintain the restriction)?

Regards,


More information about the amber-dev mailing list