He creado una clase de colección que se extiende ArrayList para agregar algunos métodos útiles. Se parece a esto:
public class Collection<T> extends ArrayList<T> {
//some methods...
}
Quiero ser capaz de unir a una colección de colecciones para una sola colección, así:
{{1, 2}, {2,3}, {1}, {2}, {}} -> {1, 2, 2, 3, 1, 2}
Tengo una idea de cómo un método estático debe verse como:
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;
}
Pero no sé cómo hacer que este método no estático (para que no acepte argumentos, así:
Collection<E> list = listOfLists.unite();
). Es eso posible? Si lo es, ¿Puede por favor ayuda con ella?
No tiene sentido hacerlo para cualquier tipo de hormigón T
. Si T
no es de un Collection
tipo, entonces unite()
es un método irrelevante (si tiene una ArrayListModified<Double>
, por ejemplo, no se puede aplanar porque eso es absurdo).
Así que o bien tienen que hacer T
limitada a las colecciones:
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;
}
}
O utilizar un método estático que toma un ArrayListModified<ArrayListModified<E>>
parámetro al igual que en su aplicación actual (aunque no tendría que ser estática).