> De: "Brian Goetz" <brian.go...@oracle.com> > À: "Remi Forax" <fo...@univ-mlv.fr>, "amber-spec-experts" > <amber-spec-experts@openjdk.java.net> > Envoyé: Dimanche 23 Août 2020 17:40:05 > Objet: Re: switch on Class ?
> It has indeed come up before. There is some overlap with pattern switch, and > some non-overlap, but it's pretty clear the impact of pattern switch is much > larger. > I would much prefer to finish the discussions on the fundamentals first, which > are actually blocking progress on a much-higher-priority feature. So let's > come > back to this later. > I also have reason to believe that, if we do generalized patterns property, we > won't need to do this as a language feature, we can do it as a library > feature. > So, let's come back to this later. Exhaustiveness is hard to emulate in a library. Rémi > On 8/23/2020 11:25 AM, Remi Forax wrote: >> There is a feature of Pizza (remember Generic Java ++) we have not discussed >> yet, >> being able to do a switch on Class. >> public sealed interface Numeric<T extends Numeric<T>> >> permits Amount, Percentage, Quantity { >> private BigDecimal value() { >> return switch(this) { >> case Amount(value) -> value; >> case Percentage(value) -> value; >> case Quantity(value) -> value; >> }; >> } >> private static <T extends Numeric<T>> T fromValue(Class<T> type, BigDecimal >> newValue) { >> return type.cast(switch(type) { >> case Amount.class -> new Amount(newValue); >> case Percentage.class -> new Percentage(newValue); >> case Quantity.class -> new Quantity(newValue); >> }); >> } >> default T add(T numeric) { return fromValue(getClass(), >> value().add(numeric.value())); } >> } >> with Amount be declared like this >> record Amount(BigDecimal value) implements Numeric<Amount> { } >> This kind of switch is interesting because it's also one that can be >> exhaustive, >> like the switch on type or the switch on Enum. >> In the method fromValue, type is typed as a Class<T> so a Class<? extends >> Numeric<...>> and given that Numeric is a sealed class only permitting >> Amount, >> Percentage and Quantity, the only possible Class for a switch(type) are >> Amount.class, Percentage.class and Quantity.class. >> I'm pretty sure the call fromValue(getClass(), ...) doesn't not compile >> because >> the compiler has no idea that all subtypes of Numeric implements >> Numeric<themselves> but you get the idea. >> regards, >> Rémi