static L flattenIterablesAndArrays(Iterable a) { new L l; for (O x : a) if (x cast Iterable) l.addAll(flattenIterablesAndArrays(x)); else if (x cast Iterator) l.addAll(flattenIterablesAndArrays(asList(x)); else if (x cast O[]) l.addAll(flattenIterablesAndArrays(asList(x))); else l.add(x); ret l; }