只是想知道是否有一种方法可以使用参数化类型调用重载方法。例如定义以下对象:
object Wrap {
def f(x: X) = println("x called")
def f(y: Y) = println("y called")
def f(a: Any) = println("Any")
def fp[T](t: T) = f(t)
}
当我测试这个时,进行以下调用
Wrap.fp(new X())
它转到对 Any 的调用。有没有办法可以从 fp() 调用适当的 f ?
有两种方法可以做到这一点:
第一种方式假设X
and Y
是已知类型而不是泛型类型。然后你可以执行以下操作:
def fp: PartialFunction[Any,Unit] ={
case x: X => println("got x")
case y: Y => println("got y")
case _ => println("Any")
}
而且不需要做太多体操就能很好地发挥作用。
第二种方式,使用类型类:
def fp[T](t: T)(implicit f: Caller[T]) = f(t)
也就是说,您的类型类可能会看起来像:
trait Caller[T]{
def apply(t: T)
}
其中,您将实际的事物放在范围内,并使用解析的顺序来找到最终的结果Caller[Any]
以便其他一切优先。所以我会这样做:
object Wrap{
implicit val xCal = new Caller[X]{
def apply(x: X){ println("x called") }
}
implicit val yCal = new Caller[Y]{
def apply(x: Y){ println("y called") }
}
}
object `package`{
implicit val anyCal = new Caller[Any]{
def apply(t: Any){ println("any") }
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)