Scala 使用isDefinedAt检查是否接受类型而不是值
我想使用Scala 使用isDefinedAt检查是否接受类型而不是值,scala,pattern-matching,Scala,Pattern Matching,我想使用isDefinedAt检查分部函数是否接受类型而不是特定值 val test: PartialFunction[Any, Unit] = { case y: Int => ??? case ComplexThing(x, y, z) => ??? } 在这里,您可以执行类似于testisdefinedat1的操作来检查该值的可接受性,但是,我真正想做的是检查所有Ints的可接受性(更具体地说,在我的情况下,我想检查的类型难以初始化(它有很多依赖项),因此,如果可
isDefinedAt
检查分部函数是否接受类型而不是特定值
val test: PartialFunction[Any, Unit] = {
case y: Int => ???
case ComplexThing(x, y, z) => ???
}
在这里,您可以执行类似于testisdefinedat1
的操作来检查该值的可接受性,但是,我真正想做的是检查所有Int
s的可接受性(更具体地说,在我的情况下,我想检查的类型难以初始化(它有很多依赖项),因此,如果可能的话,我真的希望避免创建实例-目前我只是使用null
s,这感觉很难看)。不幸的是,没有test.isDefinedAt[Int]
我并不担心它只接受这种类型的一些实例,我只是想知道这种类型是否完全不可能被接受。没有办法让
PartialFunction
这样做。事实上,由于类型擦除,在运行时很难对类型进行操作。如果希望能够在编译时验证类型,可以改用TypeClass:
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
答案似乎是这根本不可能——有其他方法可以做到这一点(如中),但这需要复制信息(这会使信息变得毫无意义,因为这样做的原因是为了避免),或者更改为不使用分部函数(由外部API指定) 最好的解决方案就是使用
null
s填充依赖项,以创建要检查的实例。这是丑陋的,也有它自己的问题,但它似乎是最好的,没有实质性的改变
test.isDefinedAt(ComplexThing(null, null, null))
除非我弄错了,否则这将需要复制有关
PartialFunction
接受的内容的所有信息?是的,尽管您可以完全取消PartialFunction
,并向typeclass添加另一个方法来进行计算。+1,这可能是一些人的解决方案,但是由于我的情况,它不适合我的需要(PartialFunction的使用是由外部API指定的,目标是测试PartialFunction,因此复制信息将使其变得毫无意义)。我想对我来说,答案就是这不可能以我喜欢的方式实现。