<div dir="ltr">Hi,<div><br></div><div>Since we are looking into pattern matching for Java, I think we should explore carefully even those features that look more exotic and may never end up in the final design. Generalized Algebraic Data Types (GADTs) represent an example of this kind of feature.</div><div><br></div><div>Here's a quick and fairly nice description of the feature and some issues related to it that arose in Scala: <a href="https://gist.github.com/smarter/2e1c564c83bae58c65b4f3f041bfb15f">https://gist.github.com/smarter/2e1c564c83bae58c65b4f3f041bfb15f</a></div><div><br></div><div>To recap, we are basically looking at this kind of code:</div><div><br></div><div>class Expr<T></div><div>class IntExpr(Integer i) extends Expr<Integer> {}</div><div>class BoolExpr(Boolean b) extends Expr<Boolean> {}</div><div><br></div><div><T> T eval(Expr<T> e) {</div><div>    switch (e) {</div><div>        case IntExpr ie: return ie.i; // Infer T=Integer, so OK to return i</div><div>        case BoolExpr be: return be.b; // Infer T=Boolean, so OK to return b</div><div>    }<br></div><div>    ...</div><div>}</div><div><br></div><div>So, the gist of it is that sometimes we can infer the type variables if a dynamic type test has succeeded. Same would work for if-match .</div><div><br></div><div>I see the following questions here:</div><div>1. Should we have this in Java at all? It may be a bit more magic than we are used to having in Java</div><div>2. Most issues related to GADTs that I'm aware of arise in the realm of structural types, i.e. functional languages or declaration-site variance (which Java luckily doesn't have today), but we'd have to look very carefully at Java generics to make sure this sort of thing won't blow up anywhere around wildcards and/or recursive type bounds, for example.</div><div><br></div><div>Observation: if we answer "yes" to 1), then this behaviour should be added as soon as we add any pattern matching, because even the most limited form of matching includes it. It seems to me that adding this later will be a breaking change.</div></div><div dir="ltr">-- <br></div><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div>Andrey Breslav</div><div>Project Lead of Kotlin</div><div>JetBrains</div><div><a href="http://kotlinlang.org/">http://kotlinlang.org/</a><br></div><div><div>The Drive to Develop</div></div></div></div>