gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:19:41 24 4
gpt4 key购买 nike

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

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 类型检查的信息都表明这是不可能的。是吗?

最佳答案

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

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

Primitive 可以作为参数传递,因为它们将被自动装箱为其等效对象(int -> Integer,long -> Long,等等)。

但是,您将被迫使用 cast 来进行类型检查。

我建议改为使用包含参数的 Object 并对功能接口(interface)进行参数化:

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

这种模式通常称为命令模式。

关于java - 传递 Java 函数作为参数和类型检查响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34348344/

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