我有一个函数,它可以是一个参数,可以是Int,Long或AnyVal的任何子类,除了Unit,它也可以是一个String。我想明确指出你只能将其中一种类型的值作为参数。我可以简单地把Any,但它不会限制任何东西。 Scala中是否有提供这种可能性的概念或功能?如果不是,你会如何管理? 现在,如果类型不兼容,我只是简单地管理函数中发生的任何异常。
没有真正展示的代码:
def myFunction(param: Any) = {...}
答案 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
对象实际上已传递给您的函数。因此,您可以向它们添加方法并实现特定于类型的行为。