Hi Georgiy,
From the 3 cases below, I think only enum case is maybe problematic.
And only because we know that no enum implementation class defines a
public no-argument constructor. Final class is perfectly fine (it can be
provided by its module with itself as the implementation class).
Annotation interface has a history of being no exception in Java
language for implementing by normal classes, so I would also not limit
it here.
For enum case then perhaps the module descriptor could enlist an enum
constant name instead of class name as the implementation. This could
also be the alternative when specifying service implementations for
interfaces. For example:
a/module-info.java:
module a {
uses pkg.Service;
}
b/module-info.java:
module b {
exports pkg;
provides pkg.Service with [instance?] pkg.impl.ServiceImpl.ONE;
}
b/pkg/Service.java:
package pkg;
public interface Service {}
b/pkg/impl/ServiceImpl.java:
package pkg.impl;
public enum ServiceImpl implements Service { ONE }
Regards, Peter
On 03/30/2016 01:18 PM, Georgiy Rakov wrote:
Hello,
currently JDK9b111 javac successfully compiles following code:
a/module-info.java:
module a {
uses pkg.FinalClassST;
uses pkg.EnumST;
uses pkg.AnnotationST;
}
a/pkg/AnnotationST.java:
package pkg;
public @interface AnnotationST{}
a/pkg/EnumST.java:
package pkg;
public enum EnumST {A,B}
a/pkg/FinalClassST.java:
package pkg;
public final class FinalClassST{}
Could you please tell if this is javac, spec or both issue that type
being referenced by 'uses' statement is not checked at compile-time
for ability to be a service interface.
The minimized testcase is attached; in order to run it please:
1. unzip attached archive on Windows machine;
2. rename test9\test_bat to test9\test.bat;
3. modify test.bat by changing JDK_HOME variable to point to your JDK
installation;
4. run test.bat.
BTW: provided the type name references non existing type javac does
produce compile error.
Thanks,
Georgiy.