让我们说我有一个参数化的课程
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变量表示的类进行参数化吗?
答案 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());