Гуава упоминалась в других ответах, но не в конкретном решении, которое даже проще, чем думают люди:
Iterable<B> onlyBs = Iterables.filter(initCollection, B.class);
Он простой и чистый, делает все правильно, создает только один экземпляр и ничего не копирует и не вызывает никаких предупреждений.
(Однако метод Collections2.filter()
не имеет этой конкретной перегрузки, поэтому, если вы действительно хотите Collection
, вам придется предоставить Predicates.instanceOf(B.class)
, и результирующая коллекция все равно будет иметь тип Collection<A>
.)