javapattern-matchingjava-14preview-feature

Pattern matching instanceof


I came across this amazing topic on https://www.baeldung.com/java-pattern-matching-instanceof. But when I try to run the following code, it throws compile time error:

if(obj instanceof String s) {
    System.out.println(s);
}

The error says:

Patterns in 'instanceof' are not supported at language level '14'

Error:(36, 34) java: pattern matching in instanceof is a preview feature and is disabled by default. (use --enable-preview to enable pattern matching in instanceof)

But I have Java 14 installed.


Solution

  • This is a preview feature in Java 14, see JEP 305 and JEP 375. To enable this, compile your class with:

    javac MainClass.java --enable-preview --release 14
    

    And now you can do:

    java MainClass --enable-preview
    

    Example of instanceof:

    Object o = "Hello World!";
    if (o instanceof String s) {
        // no explicit type casting
        s = s.replaceFirst("World", "Java"); // No compile time issues
        System.out.println(s);
    }
    

    Another example copied from JEP:

    if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}
    

    UPDATE

    Since Java 16 the "Pattern Matching for instanceof" is a fully finalized feature (i.e. not a preview anymore). So when using Java 16 or newer there is no need to separately enable this feature as it will be enabled out of the box.

    See JEP-394 for the details.