"Provides" and "with" type relationships
Konstantin Barzilovich
konstantin.barzilovich at oracle.com
Wed Mar 16 17:24:31 UTC 2016
Sorry, if this question was asked before.
Does service implementation need to inherit service interface?
Thanks,
Konstantin.
> // Ignore last mail (mail client did a surprising thing)
>
> A 'provides' clause specifies two things: a service interface and a
> service implementation. Using those terms helps to avoid confusion.
>
> A service interface does not have to be an interface; it can be an
> abstract class or even (not recommended) a concrete class.
>
> A service implementation must not be an interface, or an abstract class;
> it must be a concrete class.
>
> Therefore, it's legal (but not recommended) for a concrete class to be
> specified as both service interface and service implementation. It's
> illegal for an interface (or abstract class) to be specified as both
> service interface and service implementation. JCK will be writing tests
> for edge cases like this.
>
> Alex
>
> On 3/15/2016 12:39 PM, Paul Benedict wrote:
>> Thanks for your response Alex. If I am understanding you correctly,
>> "provides" is "not constrained to be an interface" because it can be "a
>> single interface or abstract class". So shouldn't my concrete class for
>> "provides" be rejected by the compiler? And is it okay that both types
>> were identical?
>>
>> Cheers,
>> Paul
>>
>> On Tue, Mar 15, 2016 at 2:26 PM, Alex Buckley <alex.buckley at oracle.com
>> <mailto:alex.buckley at oracle.com>> wrote:
>>
>> The first operand to 'provides' (the "service interface") is not
>> constrained to be an interface by "Modules in the Java Language and
>> JVM". This is because the spec of j.u.ServiceLoader ("a service is
>> represented by a single type, that is, a single interface or
>> abstract class").
>>
>> The second operand to 'provides' (the "service implementation") is
>> constrained not to be an interface or an abstract class by "Modules
>> in the Java Language and JVM". This is also because of the spec of
>> j.u.ServiceLoader ("provider classes must have a zero-argument
>> constructor so that they can be instantiated during loading").
>>
>> Bear in mind that the JCK team can easily set up abstract test cases
>> like this. What they can't do is check whether YOUR application runs
>> on JDK-9-with-Jigsaw, or whether arbitrary JARs on YOUR classpath
>> work as automatic modules.
>>
>> Alex
>>
>>
>> On 3/15/2016 12:07 PM, Paul Benedict wrote:
>>
>> module z {
>> exports z;
>> provides z.Main with z.Main;
>> }
>>
>> The SOTM says "Service-provider declarations can be further
>> interpreted to
>> ensure that providers (e.g., com.mysql.jdbc.Driver) actually do
>> implement
>> their declared service interfaces" (section 4, para. 8).
>>
>> I see javac checking that they are related types, but javac is
>> not checking
>> that "provides" is an interface type. That is what I was
>> expecting based on
>> the reading material.
>>
>> The other unexpected outcome was that provides/with allows the
>> identical
>> type. I don't know if that's intended, but please advise.
>>
>> PS: I did go through the open tickets this time (thanks Alan)
>> and do not
>> see any similar reports. If I missed it, I apologize; just
>> trying not to
>> waste your time by reporting a duplicate.
>>
>> Cheers,
>> Paul
>>
>>
--
Thanks,
Konstantin.
More information about the jigsaw-dev
mailing list