Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Java17/Examples
This is an informal page listing examples of features that are implemented by the Java 17 Support, which can be installed from the Marketplace. You are welcome to try out these examples. If you find bugs, please file a bug after checking for a duplicate entry here
Watch out for additional examples being added soon.
NOTE:
- Sealed Classes is standard features in Java 17.
- Restore Always-Strict Floating-Point Semantics is a standard features in Java 17.
- Pattern Matching for switch is preview feature in Java 17. They are not enabled by default and can by enabled using --enable-preview.
- In Eclipse, --enable-preview can be enabled from the Preferences. It is implicitly added while launching a java program if the feature has been enabled for the project/workspace.
Feature / Steps | Expected Result | |
---|---|---|
Standard Java/JRE setup with Eclipse | More details can be found on dedicated Java/JRE setup page. | Setting up Java/JRE in Eclipse. |
Overview of eclipse.ini | More details can be found on dedicated eclipse.ini page. | Specifying the JVM in eclipse.ini |
Preview Feature: Pattern Matching for switch | ||
Postive compilation1 (Pattern Matching for switch Example) | Use the following code:
public class X { private static void foo(Object o) { switch (o) { case Integer i -> System.out.println("String:"); case String s -> System.out.println("String: Hello World!"); default -> System.out.println("Object"); } } public static void main(String[] args) { foo("Hello World"); } } |
Code compiles and prints below message: String: Hello World! |
Positive compilation2 (Pattern Matching for switch Example) | Use the following code:
public class X { private static void foo(Object o) { switch (o) { case Integer t, String s, X x : System.out.println("Integer, String or X"); default : System.out.println("Object"); } } public static void main(String[] args) { foo("Hello World"); } } |
Code compiles and prints below message: String > 1 String Object |
Positive compilation3 (Pattern Matching for switch Example) | Use the following code:
public class X { private static void foo(Object o) { switch (o) { case Integer I: System.out.println("Integer"); System.out.println(I); break; case String s && s.length()>1: System.out.println("String s && s.length()>1"); System.out.println(s); break; case String s: System.out.println("String"); System.out.println(s); break; case X x: System.out.println("X"); System.out.println(x); break; default : System.out.println("Object"); } } |
Code compiles and prints below message: String s && s.length()>1 Hello World! String H Object |
Positive compilation4 (Pattern Matching for switch Example) | Use the following code:
public class X { public static void main(String[] args) { foo(Integer.valueOf(11)); foo(Integer.valueOf(9)); } private static void foo(Object o) { switch (o) { case Integer i && i>10: System.out.println("Greater than 10:" + o); break; case Integer j && j>0: System.out.println("Greater than 0:" + o); break; default: System.out.println("Object" + o); } } } |
Code compiles and prints below message: Greater than 10:11 Greater than 0:9 |
Positive compilation5 (Pattern Matching for switch Example) | Use the following code:
public class X { public static void foo(Object o) throws Exception { switch (o) { case String s1: throw new Exception(s1); default: break; } } public static void main(String[] args) throws Exception { foo("hello"); } } |
Code compiles and prints below exception stack trace message: Exception in thread "main" java.lang.Exception: hello at X.foo(X.java:5) at X.main(X.java:12) |
Negative compilation1 (Pattern Matching for switch Example) | Use the following code:
public class X { private static void foo(Object o) { switch (o) { case Integer t, String s, X x : System.out.println("Integer, String or X"); default : System.out.println("Object"); } } public static void main(String[] args) { foo("Hello World"); } } |
Code fails to compile with below error: A switch label may not have more than one pattern case label element |
Negative compilation2 (Pattern Matching for switch Example) | Use the following code:
public class X { private static void foo(Object o) { switch (o) { case Integer t, String s && s.length > 0, X x && x.hashCode() > 10 : System.out.println("Integer, String or X"); default : System.out.println("Object"); } } public static void main(String[] args) { foo("Hello World"); } } |
Code fails to compile with below error: A switch label may not have more than one pattern case label element |
Negative compilation3 (Pattern Matching for switch Example) | Use the following code:
public class X { private static void foo(Object o) { switch (o) { case Integer t, String : System.out.println("Error should be flagged for String"); default : System.out.println("Object"); } } public static void main(String[] args) { foo("Hello World"); } } |
Code fails to compile with below error: String cannot be resolved to a variable |
Negative compilation4 (Pattern Matching for switch Example) | Use the following code:
public class X { private static void foo(Object o) { switch (o.hashCode()) { case Integer t: default : System.out.println("Object"); } } public static void main(String[] args) { foo("Hello World"); } } |
Code fails to compile with below error: Type mismatch: cannot convert from int to Integer |
Negative compilation5 (Pattern Matching for switch Example) | Use the following code:
public class X { private static void foo(Object o) { switch (o.hashCode()) { case default: System.out.println("Default"); default: System.out.println("Object"); } } public static void main(String[] args) { foo("Hello World"); } } |
Code fails to compile with below error: The default case is already defined |
Negative compilation6 (Pattern Matching for switch Example) | Use the following code:
public class X { private static void foo(Object o) { switch (o.hashCode()) { case var s : System.out.println("Error should be ANY_PATTERN"); default : System.out.println("Object"); } } public static void main(String[] args) { foo("Hello World"); } } |
Code fails to compile with below error: 'var' is not allowed here |
Negative compilation7 (Pattern Matching for switch Example) | Use the following code:
public class X { private static void foo(Object o) { switch (o) { case 1: System.out.println("Integer"); break; default: System.out.println("Object"); } } public static void main(String[] args) { foo("Hello World"); } } |
Code fails to compile with below error: Type mismatch: cannot convert from int to Object |
Negative compilation8 (Pattern Matching for switch Example) | Use the following code:
public class X { private static void foo(Object o) { switch (o) { case Integer I: System.out.println("Integer"); System.out.println(I); case String s && s.length()>1: System.out.println("String s && s.length()>1"); System.out.println(s); break; case X x: System.out.println("X"); System.out.println(x); break; default : System.out.println("Object"); } } public static void main(String[] args) { foo("Hello World!"); } } |
Code fails to compile with below error: Illegal fall-through to a pattern |
Negative compilation9 (Pattern Matching for switch Example) | Use the following code:
public class X { private static void foo(int o) { switch (o) { case 10: System.out.println("Integer"); System.out.println(o); break; case null: System.out.println("NULL"); break; default : System.out.println(o); } } public static void main(String[] args) { foo(0); } } |
Code fails to compile with below error: Type mismatch: cannot convert from null to int |
Standard Feature: Sealed Classes | ||
Postive compilation1 (Sealed Class Example) | Use the following code:
sealed class Y permits X { } non-sealed class X extends Y { public static void main(String[] args) { System.out.println(0); } } |
Code compiles and prints 0. |
Postive compilation2 (Sealed Class Example) | Use the following code:
sealed interface I extends SI { } non-sealed class X implements SI { public static void main(String[] args) { System.out.println(0); } } sealed interface SI permits X,I { } non-sealed interface I2 extends I { } |
Code compiles and prints 0. |
Postive compilation3 (Sealed Class Example) | Use the following code:
sealed class X permits Y { public static void main(String[] args) { System.out.println(100); } } non-sealed class Y extends X { } |
Code compiles and prints 100. |
Postive compilation4 (Sealed Class Example) | Use the following code:
sealed public class X<T> { public static void main(String[] args) { System.out.println(100); } } non-sealed class Y extends X { } |
Code compiles and prints 100. |
Negative compilation1 (Sealed Class Example) | Use the following code:
sealed public sealed class X { public static void main(String[] args) { System.out.println(100); } } |
Code fails to compile with error "Multiple markers at this line
- Duplicate modifier for the type X - Sealed class or interface lacks the permits clause and no class or interface from the same compilation unit declares X as its direct superclass or superinterface" |
Syntax coloring for “sealed”, “non-sealed”, “permits” | New restricted keywords are colored | |
"Match locations" dialog supports "Permitted type declarations" | "Search > Java Search > Match locations" dialog supports "Permitted type declarations" check-box option. |