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,因此复制信息将使其变得毫无意义)。我想对我来说,答案就是这不可能以我喜欢的方式实现。