gpt4 book ai didi

lambda - Java 8 中的方法引用 : is overloading supported?

转载 作者:行者123 更新时间:2023-12-02 08:25:20 24 4
gpt4 key购买 nike

是否有任何方法可以引用 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> ,可以任意传入Objectaccept 实例方法,即你可以写

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 )

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

关于lambda - Java 8 中的方法引用 : is overloading supported?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41985922/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com