2010-06-07 20 views
4

在Java中的Type對象,我怎麼能構建一個Type對象Map<String, String>創建對應於通用型

System.out.println(Map<String, String>.class); 

不能編譯。我能想到的一種解決方法是

Map<String, String> dummy() { throw new Error(); } 
Type mapStringString = Class.forName("ThisClass").getMethod("dummy", null).getGenericReturnType(); 

這是正確的方法嗎?

+0

你需要做的破解工作假人公衆。 – aioobe 2010-06-07 11:46:34

+0

畢竟你需要這些信息?如果你詳細說明,可以給出更好的答案。 – BalusC 2010-06-07 11:52:56

+1

@aioobe如果是同一個班級,那麼'私人'是好的。 'ThisClass.class'或'getClass()'會比使用'Class.forName'更好。 – 2010-06-07 11:55:49

回答

4
public class Test { 
    public Map<String, String> dummy; 
    public static void main(String... args) throws SecurityException, 
                NoSuchFieldException { 
     Type mapStringString = Test.class.getField("dummy").getGenericType(); 
     // ... 

是一個略少醜陋的黑客攻擊..


當湯姆Hawtin建議,你可以自己實現方法:

Type mapStrStr2 = new ParameterizedType() { 
    public Type getRawType() { 
     return Map.class; 
    } 
    public Type getOwnerType() { 
     return null; 
    } 
    public Type[] getActualTypeArguments() { 
     return new Type[] { String.class, String.class }; 
    } 
}; 

返回相同的值作爲其他方法在ParameterizedType中聲明的方法。第一種方法的結果即使是.equals這種類型。 (然而,這種方法不覆蓋的toString,等於等等,所以根據您的需要,第一種方法可能仍然會更好。)

+0

宣佈虛擬靜態最終會更加醜陋:) – codymanix 2010-07-01 16:28:04

0

是的,這是在運行時獲得仿製藥的唯一方法。類型被擦除(「類型擦除」)時,字節碼-MAP是actualy對象到對象映射,在源代碼中的泛型確定指標僅用於由編譯器,以確保類型安全。

+0

樓主是要求'Type'不'Class'。 – 2010-06-07 11:51:17

+0

所有關於'Map .class'在編譯時都是已知的,所以沒有理由不應該編譯。 – 2010-06-07 11:52:19

+0

@Alexey麻煩的是'Map .class'完全沒有任何意義。 – 2010-06-07 11:56:56

2

這一切都與接口來完成,這樣你就可以建立自己的實現。

然而,最簡單的方法就是在爲目的創建了一個虛擬類使用反射。