使用泛型链接任务

Ben*_*Ben 3 java generics

我正在尝试为链接任务创建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)

我明白为什么它无法编译,但我不知道如何实现一些有效的方法并解决我的问题.

有没有人遇到过这种问题?

亲切的问候,

Joa*_*uer 5

你的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,您也可以从这种方法中获取灵感:使用已知类型参数链接任意两个函数/任务会创建一个具有易于计算的类型参数的新函数/任务.