[英]Getting a subclass' java.lang.Class instance without using a constructor
[英]Creating an instance of a parameterized class using an instance of java.lang.Class
可以說我有一個參數化的類
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。 但是是否可以創建由klass變量表示的Class參數化的MyClass實例?
是否可以創建MyClass的實例,該實例使用klass變量表示的Class進行參數化?
沒有。
原因是,就程序運行時而言, Foo<Bar>
和Foo<Baz>
之間沒有區別。
原始創建並將其轉換。 任何其他解決方案都將與之等效。
闡述路易斯·瓦瑟曼的答案:
您可以創建一個元工廠來吐出類工廠的實例:
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>
<? 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());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.