2013-10-29 62 views
5

我正在反思地調用一個方法,它的參數可能是也可能不是value class的一個實例。由於值類的目的是爲了避免對基礎值進行裝箱,如果參數類型是值類,那麼所討論的方法實際上會期望取消裝箱值。爲了處理這種情況,我試圖從值類中展開底層的值。我首先需要確定參數是一個值類的,在這裏我碰到的第一個攔路虎:Scala:識別價值類別的對象

def isObjectOfValueClass(arg: Any) = 
    classOf[AnyVal].isAssignableFrom(arg.getClass) 

預期這不起作用,因爲方法返回true

case class NonValueClass(underlying: Int) 

isObjectOfValueClass如何實施?或者是否有一種更簡單的方式來反思地調用一個可能將值類的對象作爲參數的方法?

+1

順便說一下,value類不僅可以包裝基元,還可以包裝對象。 –

回答

3

首先,請注意,您的isObjectOfValueClass將獲得您的值類實例的盒裝版本。

其次,它不能像你想要的那樣工作。這是因爲classOf[AnyVal] == classOf[AnyRef] == <java.lang.Object>

有沒有運行方式裝箱值類和參考類(Any區分沒有.instanceOf[T]AnyVal不能在模式匹配或爲.instanceOf[T]參數一起使用,什麼是最重要的,編譯值類不擴展或實施AnyVal)。

如果你想讓它決定了編譯時間,然後嘗試:

case class IsAnyVal[-T](val value: Boolean) extends AnyVal 
implicit def _noClueHowToNameThisImplicit_1 = IsAnyVal[AnyVal](true) 
implicit def _noClueHowToNameThisImplicit_2 = IsAnyVal[AnyRef](false) 
def isAnyVal[T](arg: T)(implicit ev: IsAnyVal[T]) = ev.value 

scala> isAnyVal(1) 
res4: Boolean = true 

scala> isAnyVal("") 
res5: Boolean = false 

我不知道你想怎麼提取檢測裝箱值類實例的唯一領域沒有更多意外的拳擊。此外,Hotspot在優化小型短期對象方面非常出色。