Java Generic. Необходимо создать класс, в котором бы все пары имели одинаковый тип
Класс представляет собой 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
}
Ответы (2 шт):
В классе 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);
}
}
Уверены, что постановка задачи не переусложнена и нельзя обойтись очевидной функциональностью?
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);