Scala限制函数参数可能的类型

sam*_*sam 0 types scala

我有一个函数,它可以是一个参数,可以是Int,Long或AnyVal的任何子类,除了Unit,它也可以是一个String.我想明确指出你只能将其中一种类型的值作为参数.我可以简单地把Any,但它不会限制任何东西.Scala中是否有提供这种可能性的概念或功能?如果不是,你会如何管理?现在,如果类型不兼容,我只是简单地管理函数中发生的任何异常.

没有代码可以显示:

def myFunction(param: Any) = {...}
Run Code Online (Sandbox Code Playgroud)

lmm*_*lmm 5

当你想要一个复杂的类型限制时,通常的表达方式是要求一个密封类型的隐式帮助器:

sealed trait Helper[T]
object Helper {
  implicit object IntHelper extends Helper[Int] {...}
  implicit object StringHelper extends Helper[String] {...}
  ...
}

def myFunction[T: Helper](t: T) = ...
Run Code Online (Sandbox Code Playgroud)

这种方式myFunction只能T为您定义的方法调用Helper,并且您可以使用"递归隐含"(带隐式参数的隐式函数)表达更复杂的约束.

您还可以将函数实现的类型特定情况放在Helper对象中,而不是匹配函数中的大小写,使一切更加类型安全.