Why is BiConsumer allowed to be assigned with a function that only accepts a single parameter?

前端 未结 1 1635
后悔当初
后悔当初 2020-12-03 23:08

Say, for the following example:

public class MyConsumer {
    public void accept(int i) {}
    public static void biAccept(MyConsumer mc, int i) {}
}

public         


        
相关标签:
1条回答
  • 2020-12-03 23:32

    MyConsumer::accept is a method reference to an instance method of MyConsumer class that has a single argument of type int. The MyConsumer instance on which the method is called is considered an implicit argument of the method reference.

    Therefore:

    accumulator = MyConsumer::accept;
    

    is equivalent to:

    accumulator = (MyConsumer m,Integer i) -> m.accept(i);
    

    given a targeted function type with n parameters, a set of potentially applicable methods is identified:

    • If the method reference expression has the form ReferenceType :: [TypeArguments] Identifier, the potentially applicable methods are the member methods of the type to search that have an appropriate name (given by Identifier), accessibility, arity (n or n-1), and type argument arity (derived from [TypeArguments]), as specified in §15.12.2.1.

      Two different arities, n and n-1, are considered, to account for the possibility that this form refers to either a static method or an instance method.

    (from 15.13.1. Compile-Time Declaration of a Method Reference )

    In your case the target function type is BiConsumer, which has 2 parameters. Therefore any methods of the MyConsumer class matching the name accept and having 2 or 1 parameters are considered.

    Both static methods having 2 parameters and instance methods having 1 parameter can match the target function type.

    0 讨论(0)
提交回复
热议问题