Trivial SAM convertion

Brian Goetz brian.goetz at oracle.com
Tue Apr 2 06:22:00 PDT 2013


> During my attempts to *lambdafying* my code, I came to places like this:
>
>
> *Predicate<File> isDir = File::isDirectory;*
> **
> *
> *
> *Predicate<File> isFile = isDir.negate();*
> **
> *
>            FileFilter isFileFilter = isFile::test;
>
> *
> *At first, naively I just wrote:
> *
> *FileFilter isFileFilter = isFile;
>
> *
> *After realizing my mistake, I wondered 'Why not *?' If we have two SAM
> interfaces with identical signatures (test & accept) then one can be
> converted to other.

Yes, the EG discussed the issue of "SAM to SAM conversion" at length. 
The deciding factor was that an existing language feature already gives 
you most of what you want:

   FilterFilter isFileFilter = isFile::test;

Going farther did not seem worthwhile.  The alternatives were:
  - a special syntax for the conversion
  - a silent magic conversion

Given that the above is not syntactically awful, and nicely explicit, 
prudence dictated that we stop there.

> If I may, one more question. Is this will be ever a valid code ?:
>
> Predicate<File> isFile = (File::isDirectory).negate();

Doing so would require unbounded type analysis.  To solve this, the 
compiler would have to say: "What are the instantiations of types that 
have a negate() method that returns Predicate<File>, and, if there's 
exactly one, can I use that as a target type for File::isDirectory?" 
Seems a lot to ask the compiler.



More information about the lambda-dev mailing list