2014-07-21 26 views
1

我有一個情況下,我想用isDefinedAt來檢查部分函數是否接受類型,而不是一個特定的值。檢查接受的類型,而不是價值,與isDefinedAt

val test: PartialFunction[Any, Unit] = { 
    case y: Int => ??? 
    case ComplexThing(x, y, z) => ??? 
} 

在這裏,你可以不喜歡test isDefinedAt 1檢查驗收該值,但是,我真正想要做的是檢查驗收所有Int S的(更具體地說,在我來說,我要的類型檢查是很難初始化的(它有很多的依賴),所以我真的想避免創建一個實例如果可能的話 - 目前我只是使用null s,這感覺很難看)。遺憾的是,沒有test.isDefinedAt[Int]

我不擔心它只接受這種類型的一些實例 - 我只想知道這種類型是否被接受是完全不可能的。

回答

0

的答案似乎是,這根本是不可能的 - 還有其他的方法可以做到這一點(如wingedsubmariner's answer ),但是這需要複製信息(這使得信息無意義,因爲這樣做的目的是爲了避免這種情況),或者更改爲不使用部分函數(由外部API規定)。

最好的解決方案就是使用null來填充依賴關係來創建實例來檢查。這很醜陋,有它自己的問題,但它似乎是最好的,沒有實質性的變化。

test.isDefinedAt(ComplexThing(null, null, null)) 
2

有沒有辦法使PartialFunction這樣做。事實上,由於類型擦除,在運行時對類型進行操作可能很困難。如果你希望能夠在編譯時間驗證類型,您可以改用類型類:

class AllowType[-T] { 
    def allowed = true 
} 

object AllowType { 
    implicit object DontAllowAnyType extends AllowType[Any] { 
    override def allowed = false 
    } 
} 

implicit object AllowInt extends AllowType[Int] 
implicit object AllowString extends AllowType[String] 

def isTypeAllowed[T](implicit at: AllowType[T]) = at.allowed 

isTypeAllowed[Int] // true 
isTypeAllowed[Double] // false 
+0

除非我誤會,否則這將需要複製有關'PartialFunction'接受的所有信息? –

+0

是的,儘管您可以完全拋棄'PartialFunction',並將另一種方法添加到執行計算的類型類中。 – wingedsubmariner

+0

+1,這可能是某些人的解決方案,但由於我的情況,它不適合我的需要(使用PartialFunction由外部API規定,目標是測試PartialFunction,所以複製這些信息會使其毫無意義)。我認爲對我來說,答案就是它不可能以我想要的方式。 –

相關問題