Problem of defender methods with generic methods

Alex Buckley alex.buckley at oracle.com
Mon Nov 15 14:50:32 PST 2010


Hi Ali,

On 11/15/2010 2:51 AM, Ali Ebrahimi wrote:
> if compiler can accept the following syntax:
> 
>  <A extends T & Comparable<? super A>> extension A max() default
> Trait.<A>max;
> 
> The aim is here to restrict calling of max only on CustomizedLists of
> Comparables, otherwise compiler raise compile time error.
> 
> I know this is a new concept- a kind of conditional inheritance. but
> currently this can not be implemented in java, unless by introducing a new
> subinterface. then we have two interfaces.

You and Steven have identified a valuable idiom that avoids new subtypes 
- we can call it "conditional inheritance" if you like - but 
unfortunately the generics mechanism cannot express it. Namely, the 
bound of a type variable can be _either_ another type variable _or_ a 
combination of classes and interfaces. (See JLS3 4.4.)

The trouble is erasure: if a type variable's bound could be 'T & 
Comparable<...>', then it would not be clear whether to erase max's 
return type to Object (the erasure of T) or Comparable (the erasure of 
Comparable<...>). I guess we could pick the former, but the Signature 
attribute would want to record both T and Comparable<..> for later 
typechecking of A's witness from the call site. (Does it subtype List's 
type argument _and_ Comparable<..> ?)

JLS3 4.4 arranged things to ensure a unique erasure, so it's not just a 
matter of relaxing syntax to allow your desired type variable for max.

I personally believe we will want to add extension methods that further 
restrict the enclosing generic type's bounds, and that a new 
subinterface (ComparableList<T extends...>) will often be undesirable. 
But more experience is needed.

Alex


More information about the lambda-dev mailing list