Trivial SAM convertion (original) (raw)

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 isDir = File::isDirectory; ** * * Predicate 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:

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 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, 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