The 30 second answer
Since Java 16, instanceof can test the type and bind a variable in one step, so I don't need a separate cast afterwards. For example, if obj is a String s, I can use s directly. The variable only exists where the compiler knows the match succeeded, so it also works after an and condition, or after an early return when the check fails.
// Before
if (obj instanceof String) { String s = (String) obj; use(s); }
// Java 16+
if (obj instanceof String s && !s.isEmpty()) { use(s); }
if (!(obj instanceof Order o)) return;
process(o); // o is in scope here (flow scoping)The binding is in scope only where the match definitely succeeded; obj instanceof String s || s.isEmpty() doesn't compile. It also makes equals shorter:
public boolean equals(Object o) {
return o instanceof Point p && x == p.x && y == p.y;
}Previewed in Java 14 and 15, final in Java 16. Java 21 extends patterns to switch and to record deconstruction.
Sources: JEP 394: Pattern Matching for instanceof, JLS 6.3.1 Scope for Pattern Variables
Sources (0)
See inline citations in the answer above.