2014-06-12 51 views

回答

4

由於泛型是如何在Java中設計的(通用信息僅用於編譯時),因此您絕對不能使用new T(),其中T是一個類型參數。

一個可能的選擇是做這樣的事情:

public interface ConfigurationMapFactory<K, V> { 
    public Map<K, V> createMap(); 
} 

public class Configuration <K, V> { 
    public Map<K, V> fields; 

    public Configuration(ConfigurationMapFactory<K, V> mapFactory) { 
     this.fields = mapFactory.createMap(); 
    } 
} 

雖然在這種情況下,你可以很容易地做到這一點 - 有一個原因,這是行不通的?

public class Configuration <K, V> { 
    public Map<K, V> fields; 

    public Configuration(Map<K, V> fields) { 
     this.fields = fields; 
    } 
} 
+2

除了一句*你永遠不能做'新T()'其中'T'是一個變量* - 你可以不知道(!所以該編譯器)的類型是否確實定義構造函數或不。假設在運行時'T'是'A'類型,可能只有構造函數'A(String str)'被定義,然後'new T()'將是無效的。 –

+0

在其他一些語言(C++)中,除非實際嘗試創建'Configuration ' – immibis

+0

,否則'new T()'是有效的,我不知道這一點。但我懷疑*這更容易出錯。 –