From 29484f48a0f57f21f768f5240494bc5d2d738890 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 26 Oct 2026 06:27:12 +0000 Subject: [PATCH] Add Java 25 module import declaration examples (JEP 511) --- .../java/pl/mperor/lab/java/JavaBaseImport.java | 4 ++-- .../lab/java/JavaDesktopImportAmbiguity.java | 15 +++++++++++++++ .../src/test/java/pl/mperor/lab/java/Java25.java | 16 ++++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 JavaReleases/src/main/java/pl/mperor/lab/java/JavaDesktopImportAmbiguity.java diff --git a/JavaReleases/src/main/java/pl/mperor/lab/java/JavaBaseImport.java b/JavaReleases/src/main/java/pl/mperor/lab/java/JavaBaseImport.java index 9348f68..cecbf55 100644 --- a/JavaReleases/src/main/java/pl/mperor/lab/java/JavaBaseImport.java +++ b/JavaReleases/src/main/java/pl/mperor/lab/java/JavaBaseImport.java @@ -4,7 +4,7 @@ class JavaBaseImport { - private final List listFromUtilPackage = List.of("a", "b", "c"); - private final File fileFromIoPackage = new File("file.txt"); + final List listFromUtilPackage = List.of("a", "b", "c"); + final File fileFromIoPackage = new File("file.txt"); } diff --git a/JavaReleases/src/main/java/pl/mperor/lab/java/JavaDesktopImportAmbiguity.java b/JavaReleases/src/main/java/pl/mperor/lab/java/JavaDesktopImportAmbiguity.java new file mode 100644 index 0000000..4a3bd91 --- /dev/null +++ b/JavaReleases/src/main/java/pl/mperor/lab/java/JavaDesktopImportAmbiguity.java @@ -0,0 +1,15 @@ +package pl.mperor.lab.java; + +import module java.desktop; +import java.util.List; // single-type import wins over the module import below, resolving List as java.util.List + +/// Demonstrates a caveat called out by JEP 511: `import module java.desktop` imports every package +/// exported by java.desktop (including `java.awt`, which defines `java.awt.List`) and, because +/// java.desktop is not java.base, also every package exported by java.base (including `java.util`, +/// which defines `java.util.List`). The bare name `List` is therefore ambiguous between the two +/// types; without the single-type import above, this file would not compile. +class JavaDesktopImportAmbiguity { + + final List names = List.of("John Doe", "Jane Doe"); + +} diff --git a/JavaReleases/src/test/java/pl/mperor/lab/java/Java25.java b/JavaReleases/src/test/java/pl/mperor/lab/java/Java25.java index 143dde9..b2e3a26 100644 --- a/JavaReleases/src/test/java/pl/mperor/lab/java/Java25.java +++ b/JavaReleases/src/test/java/pl/mperor/lab/java/Java25.java @@ -148,4 +148,20 @@ public void testScopedValueHasNoSetUnlikeThreadLocal() { Assertions.assertFalse(USER.isBound()); } + @Test + public void testModuleImportBringsInAllExportedPackagesOfJavaBase() { + var demo = new JavaBaseImport(); + // List.of(...) (java.util) and new File(...) (java.io) are two different java.base packages, + // both resolved inside JavaBaseImport.java by its single `import module java.base;` declaration + Assertions.assertEquals(java.util.List.of("a", "b", "c"), demo.listFromUtilPackage); + Assertions.assertEquals("file.txt", demo.fileFromIoPackage.getName()); + } + + @Test + public void testModuleImportAmbiguityResolvedBySingleTypeImport() { + var demo = new JavaDesktopImportAmbiguity(); + // proof that `names` really is java.util.List, not java.awt.List, see JavaDesktopImportAmbiguity.java + Assertions.assertEquals(java.util.List.of("John Doe", "Jane Doe"), demo.names); + } + }