基本上,我想要一個按類型對象索引的Map。在這種情況下,我試圖使用Class作爲「類型類型」。如何在Scala中創建一個類型對象的集合
以下代碼:
class SuperClass {}
val typemap = new HashMap[Class[_ <: SuperClass], SuperClass]
def insertItem1[T <: SuperClass] (item : T) = typemap += classOf[T] -> item
def insertItem2[T <: SuperClass] (item : T) = typemap += item.getClass -> item
不編譯的,因爲(1)classOf [T]是明顯無效的:
error: class type required but T found
和(2)item.getClass是錯誤的類型的:
Type mismatch, expected: Class[_ <: SuperClass], actual: Class[_]
我看到兩個途徑來實現:
要麼降日e型需求和使用Class [_]僅
或使用清單,而不是類(不知道該怎麼做還沒有任何例子是歡迎)
但更普遍,爲什麼classOf [T]無效,以及如何獲取參數化類型的類對象嗎?
更新:我發現我可以使用item.getClass.asInstanceOf[Class[T]]
來到類對象。首先,這是醜陋的。二,它沒有太大的幫助,因爲在後面的代碼我有功能,比如這一個:
def isPresent[T <: SuperClass] = typemap contains classOf[T]
很顯然,我可以使用asInstanceOf方法insertItem
並把類作爲參數傳遞給isPresent
。有沒有更好的辦法?
爲什麼你需要按類型存儲和檢索對象?我想知道是否給了更多的上下文,沒有一個不涉及'classOf'或'getClass'的不同解決方案... – huynhjl
我相信這是http://stackoverflow.com/questions/7335946/class-type-as-key-in-map-in-scala – Sohum
@huynhjl usecase是一個實體系統,我希望能夠基本上檢索給定類型的所有(註冊)對象。所以我可以爲每種類型定義一種特殊的鍵,但Class對象是這個鍵。 它可以不做的是泛型,我可以簡單地將Class對象作爲鍵傳遞,然後它將正常工作。但我認爲有更好的辦法。 – matejcik