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
)
当然,当使用不受支持的参数类型调用时,这可能会在运行时失败。
有什么方法可以引用 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
)
当然,当使用不受支持的参数类型调用时,这可能会在运行时失败。