使用java.lang.Class实例创建参数化类的实例

时间:2016-10-16 01:28:00

标签: java

让我们说我有一个参数化的课程

public class<K> MyClass {
    private K val;

    public K getVal() { return val; }

    public void setVal(K val) { this.val = val; }
}

我的目标是能够使用我作为参数传递的参数创建此类的实例。此参数的类型为java.lang.Class。

的内容
public void createInstance(Class<?> klass) {
    MyClass<klass> k = new MyKlass<>();
}

现在,我知道这是不正确的。我无法将变量klass作为参数传递给MyClass。但是有可能创建一个MyClass实例,该实例使用由klass变量表示的类进行参数化吗?

2 个答案:

答案 0 :(得分:2)

  

是否可以创建一个MyClass实例,该实例使用由klass变量表示的Class进行参数化?

没有

原因是,就您的计划运行而言,Foo<Bar>Foo<Baz>之间没有区别。

创建原始并投射它。 任何其他解决方案都等同于此。

答案 1 :(得分:1)

对Louis Wasserman的回答进行了阐述:

您可以创建一个元工厂来吐出类工厂的实例:

public class MyClassFactory<K> {
    final Class<K> klass;

    protected MyClassFactory(final Class<K> clazz) {
        klass = clazz;
    }

    protected K create() throws InstantiationException, IllegalAccessException {
        return klass.newInstance();
    }

    public static <K> MyClassFactory<K> createFactory(final Class<K> clazz) throws InstantiationException, IllegalAccessException {
        return new MyClassFactory(clazz);
    }
}

然后称之为:

MyClassFactory<? extends MyClass> myClassFactory = MyClassFactory.createFactory((new MyClass<Foo>()).getClass());
MyClass<Foo> myFooClass = myClassFactory.create();
Foo foo = new Foo();
myFooClass.setVal(foo);

但是你注意到生产的工厂给你<? extends MyClass>而不是MyClass<Foo>,所以你也可以这样做(使用同一家工厂):

MyClass<Baz> myBazClass = myClassFactory.create();
Baz baz = new Baz();
myBazClass.setVal(baz);
System.out.println(myBazClass.getVal());

不幸的是,这也是:

 MyClass fubar = myClassFactory.create();
 Object obj = new SomeArbitraryObject();
 fubar.setVal(obj);
 System.out.println(fubar.getVal());