传递 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 模式。
我需要将任意 Java 方法传递给另一个 class 方法,它将在其中异步执行。我感觉我可以使用 lambda 函数作为我的调用方法的参数,但我不确定是否需要为它创建一个功能接口。我还需要对回复进行类型检查。
private Object foo(String method, Object...args){
try{
result.set( connection.invoke(method, args) );
} catch (InterruptedException e) {
}
return result.get();
}
我还需要对响应进行类型检查,到目前为止我发现的所有关于 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 模式。