Question on returning instances of a (not exported) derived class
Peter Levart
peter.levart at gmail.com
Fri Aug 26 09:21:47 UTC 2016
Hi Martin,
On 08/25/2016 02:03 PM, Martin Lehmann wrote:
>
> I am a bit confused here, as you mention toString() . But in case [3]
> getName() is not related to toString() – at least not that I can see.
>
> InternalData.getName() overwrites Data.getName() , both returning a
> hard-coded String as result value.
>
> So did you mean getName() instead of toString() ? I.e. did you mean:
>
> Ø...because the compiler notices the static type of the
> ***.getName()*** target is InternalData which declares the
> ***getName()*** method (and overrides ***Data::getName*** method). So
> InternalData should be accessible at runtime for this invocation to
> succeed and at compile time for compilation to succeed.
>
> If you did not mean this, I would be lost here... ;-)
>
Yes, you're right. I did mean to type "getName", but my fingers typed
"toString".
The compiler references the most specific type that declares a
particular virtual method in the emited invokedynamic instructrion. In
this case, it is InternalData which is not exported to the module
performing the invocation. Hence the compile-time error.
The compiler could choose to reference the most generic type that
declares a virtual method with no effect on the final runtime behavior
(in this case, it would be Data), but I think the strategy to reference
the most specific type is meant to facilitate a binary-compatible
change: in your case, removing getName() method from Data and separate
compiling it is a binary compatible change. If the compiler choose the
most generic method's declaring class, it would not be, I think.
Regards, Peter
More information about the jigsaw-dev
mailing list