looking for FAQ on interconversion of IntFoo and Foo<Integer>

Remi Forax forax at univ-mlv.fr
Wed Apr 17 06:23:04 PDT 2013


On 04/17/2013 10:08 AM, Ali Ebrahimi wrote:
> Hi,
> does not IntSupplier  specialize Supplier? if yes, should not 
> IntSupplier wins over Supplier. what is most specific candidate?
>
> Ali Ebrahimi

yes exactly, and it wins without IntSupplier having to extends Supplier.

Let's take an example:
   public static <T> T gen(Supplier<? extends T> supplier) {
     System.out.println("generic");
     return supplier.get();
   }

   public static int gen(IntSupplier supplier) {
     System.out.println("specialized");
     return supplier.getAsInt();
   }

   public static void main(String[] args) {
     System.out.println(gen(() -> 3));
   }

it will print "specialized" even if IntSupplier doesn't inherits from 
Supplier,

gen is called with () -> int, so gen(Supplier) and gen(IntSupplier) can 
be called,
neither is more specific than the other because there is not subtyping 
relationship between Supplier and IntSupplier
but because () -> 3 is a lambda and Supplier and IntSupplier are 
function interfaces,
the compiler will see Supplier and IntSupplier as structural type,
i.e. the compiler will see Supplier as <T> () -> T and IntSupplier as () 
-> int,
and because () -> int is more specific, gen(IntSupplier) will be chosen 
are most specific method.

cheers,
Rémi

>
>
> On Tue, Apr 16, 2013 at 12:57 PM, Remi Forax <forax at univ-mlv.fr 
> <mailto:forax at univ-mlv.fr>> wrote:
>
>     On 04/16/2013 09:01 AM, John Rose wrote:
>     > Where is the standard place to find the design discussion for
>     primitive-type specializations of the new interfaces (functions,
>     producers, consumers, optionals...)?
>     >
>     > In particular, will users be able to ignore higher-order
>     functions of unboxed values and later adjust code locally for
>     efficiency?
>     >
>     > If so, are there conversion operators that correspond to
>     auto-box and auto-unbox of non-functional, which can be used to
>     make adjustments at the boundaries?
>
>      From the compiler point of view, in a lambda conversion Integer as is
>     not a boxed int,
>     so there is no such auto-boxing. Said differently a Stream of Integers
>     and a Stream of ints are not the same object.
>
>     >
>     > Finally (and this is what prompted me to ask) why not make
>     IntSupplier or OptionalInt be sub-interfaces of the
>     reference-bearing ones, with autoboxing around the edges (see below)?
>
>     At some point in the past, IntSupplier was a subtype of Supplier
>     but it
>     doesn't play well with type inference
>     and method resolution in the compiler
>     Supplier or IntSupplier because they are functional interface are seen
>     by the compiler as structural types
>     and mixing structural types and classical subtyping relationship has
>     some hairy interactions.
>
>     >
>     > Since this is probably a rehash of past discussions, I'm looking
>     to be pointed at some sort of Email thread or even (!) a wiki page.
>     >
>     > Best,
>     > — John
>
>     cheers,
>     Rémi
>
>     >
>     > P.S. It looks like this sort of stuff was in the repo at first
>     and then was yanked recently.
>     >
>     > diff --git
>     a/src/share/classes/java/util/function/IntSupplier.java
>     b/src/share/classes/java/util/function/IntSupplier.java
>     > --- a/src/share/classes/java/util/function/IntSupplier.java
>     > +++ b/src/share/classes/java/util/function/IntSupplier.java
>     > @@ -32,7 +32,12 @@
>     >   * @since 1.8
>     >   */
>     > @FunctionalInterface
>     > -public interface IntSupplier {
>     > +public interface IntSupplier
>     > +    extends Supplier<Integer>
>     > +{
>     > +    /** Returns the result of {@code getAsInt}, boxed. */
>     > +    // in my dreams, this would allows IntSupplier to convert
>     to Supplier<Integer>
>     > +    public default Integer get() { return getAsInt(); }
>     >
>     >      /**
>     >       * Returns an {@code int} value.
>     >
>     >
>
>
>



More information about the lambda-dev mailing list