如何将实际方法作为参数传递给Java中的另一个方法?

时间:2012-05-18 13:35:04

标签: java generics methods

我想要做的是轻松地将实际的方法对象传递给另一个方法。这样我就可以创建一个通用的Joiner函数,该函数连接对象列表的给定方法,而不会只传入表示该方法的字符串。这在Java中是否可行,以便我可以使用如下语法:

joinOnMethod(String, Collections<T>, Method) e.g. 
joinOnMethod(", ", someList, T.getName())

T.getName()将getName()方法传递给列表中的每个对象,而不是传入方法本身的返回类型。

希望这足以满足我的需求,

Alexei Blue。

4 个答案:

答案 0 :(得分:6)

Java中没有直接的一流功能支持。两个选项:

  • 传递方法的名称,并使用反射来获取它
  • 创建一个包含单个成员的类型,如下所示:

    public interface Function<In, Out> {
        Out apply(In input);
    }
    

    然后你可以使用匿名内部类,如下所示:

    joinOnMethod(", ", someList, new Function<T, String>() {
                     @Override public String apply(T input) {
                         return input.getName();
                     }
                 });
    

    当然,您可以将该函数提取为变量:

    private static Function<T, String> NAME_EXTRACTOR = 
        new Function<T, String>() {
            @Override public String apply(T input) {
                return input.getName();
            }
        };
    
    ...
    
    joinOnMethod(", ", someList, NAME_EXTRACTOR);
    

答案 1 :(得分:1)

我建议用Java研究命令模式。它支持回调功能。

http://en.wikipedia.org/wiki/Command_pattern#Java

答案 2 :(得分:1)

我敢打赌你刚从Javascript或其他将函数视为对象的语言转移到Java。据我所知,这是不可能的,因为Java不会将函数视为对象。你必须在for循环或其他一些构造中实际写出来。

答案 3 :(得分:1)

不,没有这样的语法。此外,由于类型擦除,实际类型T在运行时不可用,因此即使语法可用,也不可能在泛型内部。

诀窍是将Class<T>与其他参数一起传递,并使用反射来获取方法:

joinOnMethod(String separator, Collections<T> items, String methodName, Class<T> theClass)

现在,您可以在类中查询方法methodName,并在计算中使用该方法。这并没有帮助你摆脱传递字符串(即编译器不会在方法不存在时触发错误),但是你可以使用泛型来处理类型擦除。