I have the same logic in classes creation, but actual classes are different. Is it possible somehow to create an instance of a parameterized class?
Here is an example:
public class MyClass <E extends MyEntityClass> {
public List<E> myList = new LinkedList<>();
public MyClass(JsonArray params) {
for(JsonElement param : params){
myList.add(new E(param));
}
}
}
MyEntityClass - is the super class which has the constructor which accepts JsonElement.
I know that Java doesn't allow to create the parameterized class, but is it possible to solve somehow this problem?
Generics are erased after compilation.
So of course, instantiating directly a parameterized type as you try to do is not possible.
As workaround, you could pass a factory method to your constructor.
With functional interface, you could add a parameter Function<JsonElement,E>
in your constructor and use it to create instances of the generic element :
public class MyClass<E extends MyEntityClass> {
public List<E> myList = new LinkedList<>();
public MyClass(JsonArray params, Function<JsonElement, E> factoryE) {
for(JsonElement param : params){
myList.add(factoryE.apply(param));
}
}
}
And you could instantiate your class in this way :
MyClass<MyEntityClass> myClass = new MyClass<MyEntityClass>(MyEntityClass::new);
With a MyEntityClass
defined with a constructor that accepts a JsonElement
parameter :
public class MyEntityClass {
...
public MyEntityClass(JsonElement jsonElement){
...
}
...
}
Of course, you can achieve the same thing without functional interface but it would be more verbose.