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

Passing Java functions as arguments and typechecking response

我需要将任意 Java 方法传递给另一个 class 方法,它将在其中异步执行。我感觉我可以使用 lambda 函数作为我的调用方法的参数,但我不确定是否需要为它创建一个功能接口。我还需要对回复进行类型检查。

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

    }

    return result.get();
}

,但我需要传递任意数量的参数(BiConsumer 仅适用于 2 个)。我不知道我需要调用多少参数才能接受。

我还需要对响应进行类型检查,到目前为止我发现的所有关于 Java 类型检查的信息都表明这是不可能的。是吗?

您可以使用以下签名制作可变参数方法:

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

Primitive 可以作为参数传递,因为它们将被自动装箱为其等效对象(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 方法以根据参数 class 找到要调用的方法。像这样:

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;
}

这种模式通常称为 Command 模式。