我正在尝试为链接任务创建API.
首先,我设计了一个定义任务的非常简单的界面:
public interface Task<U, V> {
U execute(V input);
}
Run Code Online (Sandbox Code Playgroud)
V输入类型和U任务的输出类型在哪里.
我要创建的是一个Chain链接列表的类Tasks.
例如,我想执行: Task1<TypeA, TypeB> -> Task2<TypeB, TypeC> -> Task3<TypeC, TypeD>
这个Chain课程因此是一个Task<TypeA, TypeD>.
所以我编写了这段代码,它不能编译:
public class Chain<U, V> implements Task<U, V> {
List<Task<?, ?>> taskList;
public Chain() {
taskList = new LinkedList<Task<?, ?>>();
}
@Override
public U execute(V input) {
V currentInput = input;
U output = null;
for (Task<?, ?> task : taskList) {
output = task.execute(currentInput);
// Compile error because currentInput is of type V
// and output of type U
currentInput = output; // Compile error as well
}
return output;
}
// Other methods to add and remove tasks in the list
}
Run Code Online (Sandbox Code Playgroud)
我明白为什么它无法编译,但我不知道如何实现一些有效的方法并解决我的问题.
有没有人遇到过这种问题?
亲切的问候,
本
你的Task课与Guava课几乎一样Function.您可以使用它而不是定义自己的.
使用的一个优点Function是你可以在Functions类中使用辅助方法,其中之一是compose():
Function<String,MyObject1> stringToMyObject1 = ...;
Function<MyObject1, AnotherObject> myObject1ToAnotherObject = ...;
Function<String,AnotherObject> stringtoAnotherObject = Functions.compose(myObject1ToAnotherObject, stringToMyObject1);
Run Code Online (Sandbox Code Playgroud)
通过反复调用可以实现更深的链接compose().
即使您出于某种原因不想使用Guava,您也可以从这种方法中获取灵感:使用已知类型参数链接任意两个函数/任务会创建一个具有易于计算的类型参数的新函数/任务.