Java Generic. Необходимо создать класс, в котором бы все пары имели одинаковый тип

Рейтинг: 1Ответов: 2Опубликовано: 13.03.2023

Класс представляет собой Pair из C++, то есть он отвечает за создание пар, причем в паре могут быть элементы разных типов=> класс обобщенный(для удобства назовем его Pair)

Мне необходимо создать обобщенный класс(PairС), в котором бы хранились объекты Pair, но необходимо, чтобы все пары этого класса имели одинаковый тип, то есть Pair<Т1,Т2>

Моя идея состоит в том, чтобы запомнить Т1 и Т2 у первого объекта PairС и дальше создавать объекты с уже определенными выше Т1 и Т2, но я не понимаю, как мне запомнить Т1 и Т2, так как нельзя присвоить Т1 или Т2 какой-то конкретный тип

Это единственная моя идея, которая имеет хоть какой-то практический смысл, но использовать её абсолютно иррационально, потому что она не даёт ничего, кроме информации о том, что типы не совпадают, да и сравнение всех экземпляров класса явно займет много времени

public boolean compare(Pair firstP,Pair secondP){
        return firstP.first.getClass().equals(secondP.first.getClass());
//first- поле класса Pair
    }

Ответы

▲ 0Принят

В классе Pair<T1, T2> можно запомнить информацию о типах в статических полях, затем "спрятать" конструктор(ы), сделав их приватными, а создание экземпляров реализовать через статический же фабричный метод, в котором будут запоминаться типы для первого созданного элемента, проверяться типы для всех последующих, в случае несовпадения можно выбросить исключение.

Вариант реализации (c Lombok-аннотациями):

@Getter
@ToString
@EqualsAndHashCode
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class Pair<T1, T2> {
    private static Class<?> classFirst;
    private static Class<?> classSecond;

    private final T1 first;
    private final T2 second;

    public static<T1, T2> Pair<T1, T2> of(T1 f, T2 s) {
        if (null == classFirst || null == classSecond) {
            classFirst = f.getClass();
            classSecond = s.getClass();
        }
        if (!classFirst.equals(f.getClass()) || !classSecond.equals(s.getClass())) {
            throw new RuntimeException("Cannot create Pair for " + f.getClass() + " and " + s.getClass());
        }
        return new Pair<>(f, s);
    }
}
▲ 0

Уверены, что постановка задачи не переусложнена и нельзя обойтись очевидной функциональностью?

class PairC<T1, T2> {
    //... как-то храним пары...
    public PairC(int size) {}
    public void add(Pair<T1, T2> pair) {}
}

record Pair<T1, T2>(T1 v1, T2 v2) {}

PairC<String, Integer> first=new PairC<>(2);
Pair<String, Integer> p1 = new Pair<>("LLL", 99);
Pair<String, Integer> p2 = new Pair<>("LL1L", 99);
first.add(p1);
first.add(p2);

// а тут - ошибка компиляции
Pair<String, Float> p3 = new Pair<>("LL1LL", 99f);
first.add(p3);