Java中的方法引用 8:是否支持重载?

Method references in Java 8: is overloading supported?

有什么方法可以引用 Java 8 中的一组方法,这些方法通过重载方式改变它们的签名?

更准确地说,我希望这段代码能够工作:

public class OverloadingMethodRef
{
    public static void foo ( int x ) {
        System.out.println ( "An integer: " + x );
    }

    public static void foo ( String x ) {
        System.out.println ( "A String: " + x );
    }

    /**
     * I want it to work without this
     */
//  public static void foo ( Object x ) {
//      if ( x instanceof Integer ) foo ( (int) x ); else foo ( ( String ) x );
//  }

    public static void main ( String[] args )
    {
        // Compile error, it wants a precise reference to one of them
        Consumer<Object> c = PolymorphicMethodRef::foo; 
        foo ( "bla" ); // despite it could get it
        foo ( 1 ); // and here too
    }
}

我负担不起添加 public static void foo ( Object x ),因为我有很多方法要传递给另一个方法,我不想编写包装器。到目前为止,我只能通过反射(可以接收 param.getClass())来做到这一点,但是我必须调用的方法有不同的参数(>=1),每次我需要把它们放在一个数组中,再加上它们输入另一个。

方法引用支持使用与普通方法调用相同的规则进行重载。当你有一个 Consumer<Object> 时,你可以将任意 Object 个实例传递给它的 accept 方法,即你可以写

Consumer<Object> c = /* some expression producing it*/; 
c.accept(new JButton());
// or just
c.accept(new Object());

因为你不会写

foo(new JButton());
// or
foo(new Object());

当你只有一个foo(int)和一个foo(String)的时候,也写不出

Consumer<Object> c = OverloadingMethodRef::foo;

这将构造一个 Consumer 假装接受任意 Object 个实例。

如果愿意接受反射开销,可以使用

Consumer<Object> c=o -> {
    try {
        new Statement(OverloadingMethodRef.class, "foo", new Object[]{o}).execute();
    } catch (Exception ex) {
        throw new RuntimeException(ex);
    }
};
c.accept(42);
c.accept("bla");

(这里指java.beans.Statement)

当然,当使用不受支持的参数类型调用时,这可能会在运行时失败。