将Java函数作为参数和类型检查响应传递

我需要将一个任意
Java方法传递给另一个将异步执行的类.我有一种感觉,我可以使用lambda函数作为我的调用方法的参数,但我不确定是否需要为它创建一个功能接口.我还需要检查响应.

private Object foo(String method, Object...args){
    try{
        result.set( connection.invoke(method, args) );
    } catch (InterruptedException e) {

    }

    return result.get();
}

I noticed someone wanted to do something similar here,但我需要传递任意数量的参数(BiConsumer仅适用于2).我不知道有多少论据需要我接受.

我还需要检查响应,到目前为止我发现的关于Java类型检查的所有内容都说这是不可能的.是吗?

最佳答案 您可以使用以下签名制作varargs方法:

interface Invokable extends FunctionalInterface {
    Object invoke(Object... arguments);
}

原始可以作为参数传递,因为它们将被自动装箱到它们的对象等价物(int – > Integer,long – > Long等等).

但是,您将被迫使用强制转换进行类型检查.

我推荐的是使用Object包含参数并参数化功能接口:

interface Argument<R> {
    // Empty interface used to mark argument types.
}

interface Invokable<R, A extends Argument<R>> extends FunctionalInterface {
    R invoke(A argument);
}

然后根据参数类更改您的foo方法以查找要调用的方法.像这样:

private <A, R> R foo(A arg) {
    if (arg != null) {
        // TODO: Use injection or a map to create a relation between Class<A> and its Invokable<A, R>.
        final Invokable<A, R> invokable = invokables.get(a.getClass());
        try {
            return invokable.invoke(arg); // Type checked result (R).
        } catch (InterruptedException e) {
            // TODO: Handle exception.
        }
    }
    return null;
}

此模式通常称为命令模式.

点赞