SAM conversion of abstracted methods from java.lang.Object

Alex Buckley alex.buckley at oracle.com
Wed Aug 25 16:43:10 PDT 2010


On 8/25/2010 6:12 AM, Maurizio Cimadamore wrote:
> the current definition of SAM conversion does not consider Object 
> methods as possible targets for lambda conversion.

True. The current definition allows multiple abstract methods such that 
any non-Object methods are basically the same (this was to admit 
Comparator as SAM); but it doesn't require there to be an abstract 
_non-Object_ method in the first place (this matters for interfaces), 
and it discriminates against Object methods later (this matters for 
classes).

So let's start from the beginning. Here is how things should be:

abstract class Foo {}  // Not a SAM type; not enough abstract methods
      interface Foo {}  // Not a SAM type; no discernable abstract method

abstract class Foo { public abstract boolean equals(Object object); }
   // SAM type; Foo has one abstract method

abstract class Bar extends Foo { public abstract String toString(); }
   // Not a SAM type; too many abstract methods

abstract class Quux {
   public abstract boolean equals(Object object);
   public abstract String toString();
}
   // Not a SAM type; too many abstract methods

interface Foo { boolean equals(Object obj); }
   // Not a SAM type; too many abstract methods

interface Bar extends Foo { int compare(T o1, T o2); }
   // SAM type; Bar has one abstract non-Object method

interface Comparator<T> {
   boolean equals(Object obj);
   int compare(T o1, T o2);
}
   // SAM type; Comparator<T> has one abstract non-Object method

The definition becomes:

--
A SAM (Single Abstract Method) type is an interface type or a
top-level or member class type, that has zero generic abstract
methods, and:

- if a class type, the class is declared abstract, has a no-args
   constructor, and has exactly one non-generic abstract method;

- if an interface type, the interface has one or more non-generic
   abstract methods M1..Mn (n>=1) that are not override-equivalent to
   any method in java.lang.Object; furthermore, if Mi is not
   override-equivalent to any method in java.lang.Object and Mj is not
   override-equivalent to any method in java.lang.Object, either i==j
   or the signatures of Mi and Mj are override-equivalent.

In the type T obtained from applying capture conversion to the SAM
type, let M be the set of abstract methods in T if T is a class type;
otherwise, if T is an interface type, let M be the set of abstract
methods in T that are not override-equivalent to any method in
java.lang.Object.
--

Alex


More information about the lambda-dev mailing list