簡體   English   中英

使用java.lang.Class的實例創建參數化類的實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM