在 Java 中实例化泛型类

2022-08-31 07:13:11

我知道Java的泛型有点不如.网易.

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


答案 1

一种选择是传入(或您感兴趣的任何类型 - 指定适当引用的任何方法)并将该值保留为字段:Bar.classClass<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");
    }
}

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


答案 2

这是工厂的实现,正如Jon Skeet所建议的那样

interface Factory<T> {
    T factory();
}

class Araba {
    //static inner class for Factory<T> implementation
    public static class ArabaFactory implements Factory<Araba> {
        public Araba factory() {
            return new Araba();
        }
    }
    public String toString() { return "Abubeee"; }
}

class Generic<T> {
    private T var;

    Generic(Factory<T> fact) {
        System.out.println("Constructor with Factory<T> parameter");
        var = fact.factory();
    }
    Generic(T var) {
        System.out.println("Constructor with T parameter");
        this.var = var;
    }
    T get() { return var; }
}

public class Main {
    public static void main(String[] string) {
        Generic<Araba> gen = new Generic<Araba>(new Araba.ArabaFactory());
        System.out.print(gen.get());
    }
}

输出:

Constructor with Factory<T> parameter
Abubeee

推荐