On 27 November 2012 02:12, Mike Duigou <mike.dui...@oracle.com> wrote: > In the original patch which added the basic lambda functional interfaces, > CR#8001634 [1], none of the interfaces extended other interfaces. The reason > was primarily that the javac compiler did not, at the time that 8001634 was > proposed, support extension methods. The compiler now supports adding of > method defaults so this patch improves the functional interfaces by filing in > the inheritance hierarchy. > > Adding the parent interfaces and default methods allows each functional > interface to be used in more places. It is especially important for the > functional interfaces which support primitive types, IntSupplier, > IntFunction, IntUnaryOperator, IntBinaryOperator, etc. We expect that > eventually standard implementations of these interfaces will be provided for > functions like max, min, sum, etc. By extending the reference oriented > functional interfaces such as Function, the primitive implementations can be > used with the boxed primitive types along with the primitive types for which > they are defined. > > The patch to add parent interfaces and default methods can be found here: > > http://cr.openjdk.java.net/~mduigou/8004015/0/webrev/ > http://cr.openjdk.java.net/~mduigou/8004015/0/specdiff/java/util/function/package-summary.html
Each of the default methods is formatted on a single line. I consider this to be bad style, they should be formatted as per "normal" methods: @Override public default Double operate(Double left, Double right) { return operateAsDouble((double) left, (double) right); } It is vitally important to get this kind of formatting/style correct. Developers the world over will be copying what the style is in these classes. There is also no Javadoc on the default method override. In this case, passing a null to either parameter will result in an NPE. This should be documented. More generally, you/Oracle should define a standard form of words for describing what a default method does. Interfaces have not had them before, and their behaviour needs documenting (even if it seems obvious). /** * An operation upon two operands yielding a result. * The operands and the result are all of the same type. * <p> * The default implementation calls {@link operate(double,double)}, * throwing NullPointerException if either input is null. * * @param left the first operand, not null * @param left the first operand, not null * @return the result, not null */ @Override public default Double operate(Double left, Double right) { return operateAsDouble((double) left, (double) right); } Stephen