我创建了一个Collection类,该类扩展了ArrayList以添加一些有用的方法。看起来像这样:
public class Collection<T> extends ArrayList<T> {
//some methods...
}
我希望能够将一个Collections集合为一个Collection,就像这样:
{{1, 2}, {2,3}, {1}, {2}, {}} -> {1, 2, 2, 3, 1, 2}
我对静态方法的外观有所了解:
public static<E> Collection<E> unite(Collection<Collection<E>> arr) {
Collection<E> newCollection = new Collection<>();
for(Collection<E> element : arr) {
newCollection.merge(element);
}
return newCollection;
}
但是我不知道如何使该方法变为非静态(这样它就不接受任何参数,例如:
Collection<E> list = listOfLists.unite();
)。那有可能吗?如果是,您能帮我吗?
答案 0 :(得分:1)
对于任何具体类型T
这样做都是没有意义的。如果T
不是Collection
类型的,则unite()
是不相关的方法(例如,如果您有ArrayListModified<Double>
,则不能将其展平,因为这很荒谬)。
因此,您必须使T
绑定到集合:
public class ArrayListModified<E, T extends Collection<E>> extends ArrayList<T> {
public Collection<E> unite() {
Collection<E> newCollection = new ArrayList<>();
for (Collection<E> element : this) {
newCollection.addAll(element);
}
return newCollection;
}
}
或者使用与当前实现中一样采用一个ArrayListModified<ArrayListModified<E>>
参数的静态方法(尽管不需要是静态的)。
答案 1 :(得分:0)
一种方法是将类型参数明确声明为List<E>
,然后将其直接声明为
class NestedList<E> extends ArrayList<List<E>> {
public List<E> flatten() {
return stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
}
}
答案 2 :(得分:-1)
尝试使用'?'而不是“ E”。知道我是否正确。
cart