【发布时间】:2013-03-28 09:45:37
【问题描述】:
我有一些番石榴Functions,比如Function<String,Set<String>>。使用带有FluentIterable.transform() 的那些会导致FluentIterable<Set<String>>,但是我需要FluentIterable<String>。所以我现在的想法是继承 FluentIterable<E> 并添加一个新方法 transform2() 在返回之前简单地将所有内容合并到一个集合中。
原来的transform方法是这样的:
public final <T> FluentIterable<T> transform(Function<? super E, T> function) {
return from(Iterables.transform(iterable, function));
}
我为我的子类和transform2() 方法想到了类似的东西:
public abstract class FluentIterable2<E> extends FluentIterable<E>
{
public final <T> FluentIterable<T> transform2(Function<? super E, Collection<T>> function) {
// (PROBLEM 1) Eclipse complains: The field FluentIterable<E>.iterable is not visible
Iterable<Collection<T>> iterables = Iterables.transform(iterable, function);
// (PROBLEM 2) Collection<T> merged = new Collection<T>(); // I need a container / collection - which one?
for(Collection<T> iterable : iterables)
{
// merged.addAll(iterable);
}
// return from(merged);
}
}
目前我的新子类有两个问题,上面标有PROBLEM 1 和PROBLEM 2
问题 1:原始 FluentIterable 类中的可迭代字段是私有的 - 我该怎么办?我可以在我的子类中创建一个具有相同名称的新私有字段,这样可以吗?我的子类中调用 super.someMethod() 并使用该字段的方法呢?然后他们会使用可能具有不同值的超类的字段吗?
问题 2:我需要一些通用集合,我可以在其中组合多个集合的内容,但集合是一个接口,所以我无法实例化它。那么,我可以在那里使用哪个类?
如果解决方案仅适用于集合,那将是可以接受的,但我更喜欢适用于集合和列表的解决方案。
感谢您对此的任何提示!
【问题讨论】:
标签: java generics collections subclass guava