Принимая объединение двух наборов с разными типами
Я хочу получить объединение двух наборов, которые являются объектами двух разных классов (с одинаковыми переменными экземпляра и методами).
Оба этих класса реализуют общий интерфейс, и оба набора имеют этот интерфейс как тип.
Так, например:
У меня есть класс A и класс B, которые реализуют интерфейс "Общий"
Set1 содержит элементы класса A и определяется следующим образом:
Set<Common> set1 = new HashSet<Common>();
Set2 содержит элементы класса B и определяется как:
Set<Common> set2 = new HashSet<Common>();
Теперь я пытаюсь взять объединение, сначала скопировав в него set1:
Set<Common> unionSet = new HashSet<Common>(set1);
Теперь я делаю объединение (или addAll) с set2:
unionSet.addAll(set2);
но в итоге происходит, если есть элемент, который одинаков в set1 и set2, unionSet сохраняет его дважды, а не один раз.
из того, что я понимаю, методы hashCode и equals не смогут работать с элементами, которые принадлежат двум разным классам, и поэтому два элемента (которые имеют одинаковые свойства), но принадлежат разным классам, хранятся дважды.
К вашему сведению, это то, на что похожи класс A и класс B:
int x1;
String y1;
//Constructors//
//getters-setters//
//toString//
//hashCode and equals//
Пожалуйста, не говорите мне создавать элементы из одного класса, а затем использовать объединение, поскольку мое требование состоит в том, чтобы элементы принадлежали двум разным классам.
Я подумал, что действительно элементарный способ сделать это - взять цикл for для одного из наборов (скажем, set2, который имеет элементы ClassB) и добавить их один за другим в новый набор другого класса (ClassA).) используя аргумент-конструктор.
Затем возьмите объединение между этим новым набором и другим набором, который теперь имеет элементы, принадлежащие к тому же классу.
Я хотел знать, есть ли более эффективное и элегантное решение для этого.