是否可以在Java中创建参数化类的实例?

时间:2017-07-30 19:00:55

标签: java reflection parameterization

我在类创建中有相同的逻辑,但实际的类是不同的。是否有可能以某种方式创建参数化类的实例?

以下是一个例子:

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 - 是具有接受JsonElement的构造函数的超类。

我知道Java不允许创建参数化类,但有可能以某种方式解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

编译后会删除泛型 因此,当然,在您尝试执行时直接实例化参数化类型是不可能的。

作为解决方法,您可以将工厂方法传递给构造函数。

使用功能界面,您可以在构造函数中添加参数Function<JsonElement,E>,并使用它来创建泛型元素的实例:

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));
        }
    }
}

你可以用这种方式实例化你的课程:

MyClass<MyEntityClass> myClass = new MyClass<MyEntityClass>(MyEntityClass::new);

使用接受MyEntityClass参数的构造函数定义JsonElement

public class MyEntityClass {
    ...
    public MyEntityClass(JsonElement jsonElement){
      ...
    }
   ...
}

当然,你可以在没有功能界面的情况下实现同样的目标,但它会更加冗长。