CSR :
|
|
Relates :
|
|
Relates :
|
|
Relates :
|
Summary ------- Support _pattern matching_ by the `instanceof` operator: ... o is a variable declared with a general type such as Object ... if (o instanceof <type> v) { ... use the newly declared variable v which refers to the same object as o but with a more specific type ... } Problem ------- The `instanceof` operator is typically used in code like this: ... o is a variable declared with a general type such as Object ... if (o instanceof <type>) { <type> v = (<type>) o; ... } The static type of the variable `o` is too general to be useful, but this part of the program is aware that the variable `o` might refer at run time to an object whose type is more specific and thus more useful. To use the object in a type-safe manner, the program must mention the more specific type **three** times: (1) in the `instanceof` operator which examines the object referred to by `o`, (2) in the declaration of a new variable, and (3) in the cast of `o`. This idiom is laborious to write, which increases the chance of a mistake, and, more importantly it is boilerplate which slows down all readers. Solution -------- Allow the right hand side of the `instanceof` operator to take a _pattern_ consisting of a type and a variable name. A boolean expression of the form `<expr> instanceof <type> v` is evaluated as follows: if the value of `<expr>` is _dynamically_ an instance of `<type>`, then declare variable `v` whose _static_ type is `<type>` and initialize `v` with the value of `<expr>`. The scope of variable `v` includes sections of code which are executed if the result of `instanceof` is true. The scope may extend beyond the statement which contains an `instanceof` operator, e.g., beyond an `if` statement whose conditional includes an `instanceof`. The `<type>` in an `instanceof` is allowed to be non-reifiable if `<expr>` can be cast to `<type>` without unchecked warnings. This applies to both the "traditional" form of `instanceof` (`<expr> instanceof <type>`) and to the "pattern-matching" form of `instanceof` (`<expr> instanceof <type> v`). The Compiler Tree API is updated to model the pattern-matching form of `instanceof`. Specification ------------- The draft specification is attached. It is also available at http://cr.openjdk.java.net/~gbierman/jep305/jep305-20191021/specs/patterns-instanceof-jls.html The specdiff for the Compiler Tree API change is attached as specdiff.04a.zip. It is also available at http://cr.openjdk.java.net/~jlahoda/8231826/specdiff.04/overview-summary.html
|