* if the corresponding cast is statically known to be correct
(identity/widening conversion), args() should directly match
* if the corresponding cast is legal, but not known to be correct
(narrowing conversion), args() should match with a runtime check in so
far this is possible; if the cast is completely or partially
uncheckable, it should assume the uncheckable parts hold, but emit an
unchecked-match warning
* if the corresponding cast is forbidden, args() should not match

Whatever interpretation of the specification though, you have
discovered a severe bug because args(List<Number>) matches a
List<Integer>, without any warning, while the corresponding cast
between these types is simply forbidden.

(You can see the cast is forbidden because there is no subtype
relation in either direction between these types. Officially, the JLS
forbids casts between types with (supertypes with) the same erasure
but disjoint type arguments.)

By allowing this conversion, you break Java Generics soundness
(without warnings), so if the specification intended to allow this
(which I don't think it did), it should be fixed as well. To
illustrate the safety problem, the following is a complete example to
produce a ClassCastException: