一尘不染

在Java中实例化泛型类

java

我知道Java的泛型在某种程度上逊于.Net。

我有一个泛型类Foo<T>,我确实需要使用无参数构造函数实例化T in Foo。如何解决Java的局限性?


阅读 1167

收藏
2020-02-28

共1个答案

一尘不染

一种选择是传递Bar.class(或你感兴趣的任何类型-以任何方式指定适当的Class<T>引用)并将该值保留为字段:

public class Test {
    public static void main(String[] args) throws IllegalAccessException,
            InstantiationException {
        Generic<Bar> x = new Generic<>(Bar.class);
        Bar y = x.buildOne();
    }
}

public class Generic<T> {
    private Class<T> clazz;

    public Generic(Class<T> clazz) {
        this.clazz = clazz;
    }

    public T buildOne() throws InstantiationException, IllegalAccessException {
        return clazz.newInstance();
    }
}

public class Bar {
    public Bar() {
        System.out.println("Constructing");
    }
}

另一种选择是具有“工厂”接口,然后将工厂传递给泛型类的构造函数。这更加灵活,你无需担心反射异常。

2020-02-28