Virtual extension methods -- a strawman design
Peter Levart
peter.levart at gmail.com
Tue May 25 11:35:10 PDT 2010
On Monday 24 May 2010 07:01:58 am Neal Gafter wrote:
> Both default behaviors can be improved by recognizing that these
> different methods don't have to resolve to the same implementation:
>
> If both interface A and interface B declare defender methods with the
> same signature, there is no ambiguity in a class C that extends A and
> B. Invoking the method through C is a compile-time error (ambiguous),
> invoking through A gets A's behavior, and invoking through B gets B's
> behavior. There is no need to guess how rare these cases might be.
>
How could this be achieved without modifying the specification of the JVM? If C implements both A
and B then it only contains a single instance method that @Override-s both methods in interfaces
A and B at the same time. The invokeinterface bytecode dispatches to the same method
implementation regardless of whether it was specified as A.method or B.method.
How could C provide distinct implementations of a method with the same name and parameter types
that would be selected in response to invoking them via interface A or B? Is it possible for
code emited by javac in the single method body to find out via which invokeinterface method it
was actually invoked and dispatch accordingly?
Regards, Peter
> On Sun, May 23, 2010 at 5:52 PM, Howard Lovatt <howard.lovatt at gmail.com> wrote:
> > Alex Blewitt said:
> >> This is the classic 'diamond problem' that is experienced with multiple
> >> implementation inheritance. Unfortunately, the proposal document
> >> (http://cr.openjdk.java.net/~darcy/DefenderMethods.pdf) brushes this
> >> under the covers (5.1) with a 'should throw an exception' at this
> >> point. This is pretty silent, outside of any compiler warnings, and is
> >> definitely a change of behaviour.
> >
> > Section 4.2 seems to cover what happens.
> >
> > "4.2. Resolving ambiguity
> > If the class implements multiple extended interfaces, both of which
> > provide a default
> > implementation for the same method name and signature, the
> > implementing class MUST
> > provide an implementation. (This is expected to be a quite unusual
> > case.) The existence
> > of the InterfaceName.super.methodName() syntax makes it easy for the
> > class to choose
> > one of the defaults. (We might choose to relax this restriction if
> > both interfaces provide the same default.)"
> >
> > This solution is the normal solution for traits, i.e. programmer has
> > to resolve the issues.
> >
> > Alex Blewitt said:
> >> public class A implements DataStructure {
> >> public boolean filter(FilterSam filter) {...}
> >> }
> >> // Later, someone makes the change:
> >> public interface DataStructure {
> >> extension DataStructure filter(FilterSam filter) default
> >> Default.filter; }
> >
> > When A is net recompiled there is a compiler error. If A is not
> > recompiled there is a link error. See section:
> >
> > "5.1. Resolving ambiguity
> > In the unlikely case that the VM attempts to load a class that
> > implements multiple
> > extended interfaces that have a common defender method but with
> > different defaults, the
> > VM should not attempt to resolve the ambiguity automatically.
> > Instead, it should
> > generate a bridge method that throws UOE or similar exception. We
> > expect this situation
> > to be rare."
> >
> > I would agree with the assessment that this will be rare and therefore
> > catching the error is sufficient.
> >
> > -- Howard.
More information about the lambda-dev
mailing list