2012-07-28 88 views
3

我有一個變量:泛型語法的Map.Entry

Class<Map.Entry<String, Boolean>> clazz; 

我想將類分配給它沒有任何實例。但編譯器不讓我寫:

Class<Map.Entry<String, Boolean>> clazz = Map.Entry<String, Boolean>.class; 

我該怎麼做這個任務?

+0

你是什麼意思分配類沒有實例化任何東西?可能你需要給它分配'null'? – 2012-07-28 12:17:23

+0

你想做什麼,對我沒有任何意義。你能解釋你的意圖嗎? – nullpotent 2012-07-28 12:18:56

+0

我想有一個類型的對象分配給我的變量。我可以用新的Map.Entry()。getClass(more-less)做到這一點,但我不想實例化新的對象只是爲了得到它的類 – piotrek 2012-07-28 12:26:03

回答

2
Class<Map.Entry<String, Boolean>> clazz = 
    (Class<Map.Entry<String, Boolean>>)(Class<?>)Map.Entry.class; 

啊,類型擦除的樂趣。

Java編譯器區分類型Map.Entry(原始)和Map.Entry<String, Boolean>(參數化)。不幸的是,您不能使用.class在類型字面量中添加類型參數。所以你必須施放。但是你不能直接這樣做;您必須通過Class<?>進行'繞道'。我不記得爲什麼,確切地說,我很抱歉:)。

此外,你會得到一個'unchecked'警告,你可以壓制,因爲你知道(在這種情況下)演員總是會成功。所以:

@SuppressWarnings("unchecked") 
Class<Map.Entry<String, Boolean>> clazz = 
    (Class<Map.Entry<String, Boolean>>)(Class<?>)Map.Entry.class; 

(沒有必要把警告在哪裏這個任務發生的方法,你可以把它直接在任務面前。)

享受! :)

+1

哦,我不打算抽出Eclipse來檢查你的響應..我已經打了足夠多的這些問題,以確認正確的工作原則... upvote。 – 2012-07-28 12:23:59

+0

@RichardSitze謝謝!我想這是Java用微妙的方式告訴人們他們不應該在第一時間做這種討厭的反思的東西:)。 – jqno 2012-07-28 12:26:49

+0

他們確實添加了泛型,但沒有可能分配參數化的類。難以置信的!這個解決方案是醜陋的,但它實際上是有效的,似乎是唯一可能的。 thx – piotrek 2012-07-28 12:35:17