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

时间:2014-11-25 08:45:39

标签: scala types

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

没有真正展示的代码:

def myFunction(param: Any) = {...}

2 个答案:

答案 0 :(得分: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) = ...

这样myFunction只能为您定义了T的{​​{1}}调用,并且您可以使用“递归隐含”来表达更复杂的约束(隐式函数具有隐式参数)。

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

答案 1 :(得分:2)

您可以使用类型类来执行此操作:

trait CanUse[T]

object CanUse[T] {
  implicit object canUseInt extends CanUse[Int]
  implicit object canUseString extends CanUse[String]
  // etc.
}

def myFunction[T : CanUse](x: T) = { ... }

myFunction的符号是:

的语法糖
def myFunction[T](x: T)(implicit ev: CanUse[T]) = { ... }

因此,您可以看到隐式canUse对象实际上已传递给您的函数。因此,您可以向它们添加方法并实现特定于类型的行为。