gpt4 book ai didi

scala - 使用参数化类型的方法重载

转载 作者:行者123 更新时间:2023-12-04 23:50:46 26 4
gpt4 key购买 nike

只是想知道是否有办法使用参数化类型调用重载方法。例如定义以下对象:

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 吗?

最佳答案

有两种方法可以做到:

第一种方式假设 XY是已知类型而不是泛型类型。然后你可以做以下事情:

 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") }
}
}

关于scala - 使用参数化类型的方法重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22794295/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com