Задачу уже решил через pets.removeAll(cats). Но почему не сработало такое решение? public class Solution { public static void main(String[] args) { Set<Cat> cats = createCats(); Set<Dog> dogs = createDogs(); Set<Object> pets = join(cats, dogs); printPets(pets); removeCats(pets, cats); printPets(pets); } public static Set<Cat> createCats() { Set<Cat> result = new HashSet(); Cat cat1 = new Cat(); Cat cat2 = new Cat(); Cat cat3 = new Cat(); Cat cat4 = new Cat(); result.add(cat1); result.add(cat2); result.add(cat3); result.add(cat4); return result; } public static Set<Dog> createDogs() { Set<Dog> result = new HashSet(); Dog dog1 = new Dog(); Dog dog2 = new Dog(); Dog dog3 = new Dog(); result.add(dog1); result.add(dog2); result.add(dog3); return result; } public static Set<Object> join(Set<Cat> cats, Set<Dog> dogs) { Set<Object> set = new HashSet(); set.addAll(cats); set.addAll(dogs); return set; } public static void removeCats(Set<Object> pets, Set<Cat> cats) { Iterator<Object> itr1 = pets.iterator(); Iterator<Cat> itr2 = cats.iterator(); while(itr1.hasNext()) { Object o = itr1.next(); while(itr2.hasNext()) { Cat c = itr2.next(); if(o == c) itr1.remove(); } } } public static void printPets(Set<Object> pets) { for(Object o: pets) { System.out.println(o); } } public static class Cat { } public static class Dog { } }