2013-04-15 81 views
2

我們編寫一個使用泛型的庫,我不確定如何創建泛型類型的實例。不久如何編寫創建方法?泛型類啓動

public class Lib<V extends Base> { 

    private HashMap<Integer, V> map = new HashMap<Integer, V>();  

    public V get(int key) { 
     return map.get(key); 
    } 

    public void add(int key, V value) { 
     map.put(key, value); 
    } 

    public void create(int key) { 
     // V v = new V(); // ?? How to implement this line 
     // add(key++, v); 
    } 
} 
+0

你在做什麼? – aymankoo

+0

這是不可能的, – BlackJoker

+0

(您可能想要刪除該靜態字段。)(編輯:哦,我會做的。) –

回答

0

您不能在泛型類型中使用new; java中的泛型有類型擦除。請參閱http://docs.oracle.com/javase/tutorial/java/generics/erasure.html

類型擦除可確保不會爲參數化類型創建新類;因此,泛型不會導致運行時開銷。

雖然有一些骯髒的方法來獲取您的泛型類的實例;例如: -

void create(Class<V> foo) 
{ 
    foo.newInstance(); // Create a new instance of generic type V 
} 

或者,你可以創建富作爲一個私有成員,做到這一點,而不必通過「type.class」的方法,讓你把類的構造函數: -

class bar<V> 
{ 
    private Class<V> baz; 

    private V qux; 

    public bar(Class<V> foo) 
    { 
     baz = foo; 
    } 

    void create() 
    { 
     qux = baz.newInstance(); 
    } 
} 

bar<Integer> quxx = new bar<Integer>(Integer.class); 

正如其他人所說,你可以創建一個工廠,爲你做到這一點。還有另一個堆棧溢出帖子有進一步的信息Create instance of generic type in Java?

+0

FFS,不要使用反射。 (謝天謝地,Java足以阻止你的代碼編譯。 –

+0

是否投票完全必要?我已經建議可以使用工廠來做到這一點,並提供了一個鏈接,這使用工廠.. – chrisw

+1

建議使用反射這是危險的。是的,它值得downvotes。 –

2

從語言的角度來看,沒有保證V有一個非拋出,可訪問,無參數的構造函數。處理這種情況的標準方法是引入一個抽象工廠,例如my answer here

+0

@TomHawtintackline你的方法是驚人的!Thx的建議。 – Eugene

0

你應該真的考慮@Tom Hawtin - tackline答案。這是最好的,而且這種方法非常美麗!它所需要的只是一直添加另一個工廠實現,但它是安靜的小額支付。

public class InstanceOfGenericClass { 
     public static void main(String[] args) { 
      new GenericClass<VPassed>(new FactoryImpl()).createInstance(); 
     } 
    } 

// ----------------------------------------- -------------------

class GenericClass<V>{ 

    private final Factory<V> factory; 
    public GenericClass(Factory<V> factory){ 
     this.factory = factory; 
    } 

    V createInstance(){ 
     return factory.create(); 
    } 
} 

// ---------------------- ---------------------------------------

interface Factory<V>{ 
V create(); 

}

// ----------------------------------------------- --------------

class FactoryImpl implements Factory<VPassed>{ 
    @Override 
    public VPassed create() { 
     return new VPassed(); 
    } 
} 

// ------------------------------------------ --------------------

class VPassed{}