> 4. Diamond for type patterns (and record patterns)
The type pattern `T t` declares `t`, if the pattern matches, with the type T. If T is a generic type, then we do a consistency check to ensure soundness: List<String> list = … switch (list) { case ArrayList<String> a: A // ok case ArrayList<?> a: B // ok case ArrayList a: C // ok, raw type case ArrayList<Frog> a: // error, would require unchecked conversion } All of these make sense, but users are going to be tempted to use `case AerrayList a` rather than the full `case ArrayList<String> a`, and then be sad (or confused) when they get type errors. Since the type can be precisely defined by inference, this seems a place for allowing diamond: case ArrayList<> a: B (And the same when we have record patterns.)