У меня есть класс, представляющий пару из двух значений одного и того же типа (тип, который может быть любым из определенного набора типов):
public class Pair<E extends AClass>{
private E var1;
private E var2;
}
Этот класс используется каркасом, поэтому ему нужен конструктор без аргументов, в котором мне нужно создать экземпляр двух переменных (var1, var2):
public class Pair<E extends AClass>{
private E var1;
private E var2;
public Pair(){
var1 = invoke constructor of type E;
var2 = invoke constructor of type E
}
}
Здесь, очевидно, существует ряд проблем:
-
Чтобы создать экземпляр переменных, я должен как-то узнать его точный тип и вызвать этот конкретный конструктор типов; в лучшем случае это означает, что в конструкторе есть довольно большой оператор if else, например:
public Pair(){ if(var1 instanceof SpecificType1){ var1 = new SpecificType1(); var2 = new SpecificType2(); } }
-
Даже если я сделаю так, как описано выше, у меня возникнут некоторые проблемы, потому что var1 объявлен типа E, и я получу ошибку несоответствия типа при попытке создать экземпляр SpecficType1 и назначить приведенный объект var1/var2. Чтобы заставить его работать, я должен отбросить его на E:
var1 = (E)new SpecificType1();
Но это уничтожает проверку типа времени компиляции, поскольку я пытаюсь применить конкретный тип к родовому типу.
Является ли это ограничением дженериков в java или этот сценарий является плохим для использования Generics?