【发布时间】:2011-12-30 14:46:33
【问题描述】:
我一直在努力解决以下问题。我有一系列函数对象,每个函数对象都有自己的输入和输出类型,这些类型是通过 java 中的泛型类型参数定义的。我想将它们排列成一个链,以便原始数据输入到第一个函数,转换为输出类型,即下一个对象的输入类型,依此类推。当然,这对于硬编码来说是微不足道的,但我希望代码可以插入到新的函数对象中。如果我只是省略了类型参数(只有最终的输出类型),这就是事情的样子:
public T process() {
Iterator<Context> it = source.provideData();
for(Pipe pipe : pipeline) {
it = pipe.processIterator(it);
}
return sink.next(it);
}
这里在函数对象之间传递数据的迭代器,上下文应该是上下文。有没有办法保持以下类型的管道可插拔并仍然保持类型安全?
编辑:
为清楚起见,我有一系列功能对象,管道。每个都将特定类型作为输入并输出另一种类型。 (实际上是这些类型的迭代器)这些将链接在一起,例如Pipe<A,B> -> Pipe<B,C> -> Pipe<C,D> -> ...,因此一个管道的输出是下一个管道的输入类型。这里还有一个输出 A 类型迭代器的源和一个接受类型的接收器(过去管道的输出)。这会让事情变得更清楚吗?问题是,由于对输入和输出类型的兼容性存在严重依赖关系,有没有办法确保这一点?
我开始认为将函数对象插入管道可能是确保类型安全的最佳时机,但我不确定如何执行此操作。
编辑 2: 我有一个函数对象的加法器方法,目前如下所示:
public void addPipe(Pipe<?,?> pipe) {
pipeline.add(pipe);
}
我想检查第一个类型参数是否与当前管道的“结束”相同,如果不是则抛出异常?我不认为这里有一个很好的方法来获得编译时的安全性。然后可以将当前管道的“结束”设置为输入管道的第二种类型参数。我想不出如何使用泛型来做到这一点,并且传递类信息似乎非常可怕。
【问题讨论】:
-
类型擦除可能会让您对完全通用的功能更加困难。 JVM 字节编译器从泛型类的实例中删除类型,因此 List
变为 List -
您能再解释一下需求吗?无法弄清楚自己拥有什么以及想要拥有什么。
-
那么最好的方法是在插入管道函数对象时尝试确保类型安全(如何??),并在上述方法中抑制警告?
-
试图澄清。希望对您有所帮助。
标签: java generics chain-of-responsibility