我需要将一个任意
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;
}
此模式通常称为命令模式.