Принимая объединение двух наборов с разными типами

Я хочу получить объединение двух наборов, которые являются объектами двух разных классов (с одинаковыми переменными экземпляра и методами).

Оба этих класса реализуют общий интерфейс, и оба набора имеют этот интерфейс как тип.

Так, например:

У меня есть класс 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).) используя аргумент-конструктор.

Затем возьмите объединение между этим новым набором и другим набором, который теперь имеет элементы, принадлежащие к тому же классу.

Я хотел знать, есть ли более эффективное и элегантное решение для этого.

0 ответов

Другие вопросы по тегам