使用参数化类型重载方法

2024-03-04

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

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(使用前将#替换为@)

使用参数化类型重载方法 的相关文章

随机推荐

  • 每当事件发生时触发 Spark 作业

    我有一个 Spark 应用程序 每当收到有关某个主题的 kafka 消息时就应该运行 我每天不会收到超过 5 6 条消息 因此我不想采用 Spark Streaming 方法 相反 我尝试使用提交申请SparkLauncher但我不喜欢这种
  • NSManagedObject 无法遵守 Swift 中的协议

    我需要 NSManagedObject 和常规 NSObject 的共享接口 在 Objective c 中 我可以使用协议来实现这一点 但在 Swift 中我遇到了这个运行时错误 有什么解决办法吗 提前致谢 protocol Produc
  • 将多列转换为一大列 (Excel 2010)

    我想将 15 096 列文本 每个单元格一个单词 转换为一个大列 包括原始列中的每个单元格 我原来的列大小各不相同 即一列可能有 4 个单元格 行 而另一列可能有 100 个单元格 行 我没有使用 VBA 的经验 但已经录制了一个宏来手动执
  • 如何将netcdf4-python安装到ubuntu14.04上?

    我想将 netcdf4 python 安装到我的 Ubuntu14 04 上 libhdf5 dev 1 8 11 5ubuntu7 amd64 deb 和 libnetcdf 4 1 3 7ubuntu2 amd64 deb 已安装 我从
  • Oracle SQL Developer - 错误:“在预期位置未找到 FROM 关键字”

    抱歉我的菜鸟问题 但我正在尝试找出为什么我的 Oracle SQL 指示错误 在预期的位置未找到 FROM 关键字 如下图 我尝试运行的代码如下 select PCKCOO AS COMPANHIA DO PEDIDO NUMERO DO
  • 从小部件启动时,活动未显示在最近的应用程序列表中

    我创建了一个应用程序小部件 单击该小部件后 会在我的应用程序中启动一个活动 它发起的活动是NOT主启动器活动 如应用程序清单中设置
  • 有人有使用 berkeley db 和 PHP 的经验吗?

    我必须访问和写入其他应用程序共享的一些伯克利数据库文件 我真的没有找到任何关于在 PHP 中使用它的信息 看起来确实不太受欢迎 有谁有任何链接或资源可供我用来让事情顺利进行吗 Thanks 这不就是dba的功能吗 http php net
  • 如何同时指定div的绝对位置和相对位置

    我是新来的 我想知道如何同时将 div 的位置指定为绝对位置和相对位置 因为 div 可以同时是子级和父级 感谢您的帮助 如果孩子处于绝对位置 任何孙子可以再次绝对定位关系中给孩子 也就是说 孩子不需要position relative为孙
  • DQL 左连接 - sql 示例

    运行良好的 SQL 是 SELECT ro id role rr id role resource re id resource FROM resource re LEFT JOIN role resource rr ON rr resou
  • Google Maps API v3:是否有 setMap() 事件的回调或事件侦听器?

    我正在开发的网站上使用 Google Maps API v3 我的地图下方有一个下拉框 允许用户在地图上显示的不同标记组之间切换 每个标记都使用显示marker setMap 我的问题是地图有时需要很长时间才能显示新标记 尤其是在 IE 中
  • 在 CloudFormation 中为 AWS Load Balancer v2 配置连接耗尽

    这篇博文 https aws amazon com blogs aws elb connection draining remove instances from service with care 这里特别 https s3 amazon
  • 以编程方式获取私有 Vimeo 视频的 URL/嵌入代码

    我们一直是 Vimeo PRO 的长期用户 我们用它来托管在多个网站上显示的视频 这些视频被设置为私有 因此无法在 Vimeo 的公共部分找到它们 到目前为止 每当我们需要显示视频时 我们要么从 Vimeo 获取嵌入代码 要么复制 直接链接
  • 我如何检查我的 sqlite 表中是否有数据?

    编辑 根据下面的答案稍微更改了代码 但仍然无法正常工作 我还添加了一条日志消息来告诉我 getCount 是否返回 gt 0 确实如此 所以我怀疑我的查询可能有问题 或者我对光标的使用 我创建了一个表 我想检查它是否为空 如果它为空 我想运
  • MongoDB:使用 $ 位置运算符进行查询

    我有一个集合 其中的条目如下所示 userid 1 contents tag whatever value 100 tag whatever2 value 110 我希望能够查询该集合并仅返回数组的一部分 与查询匹配的部分 我正在尝试使用
  • 在 WooCommerce 中最后显示缺货产品 - 不包括延期交货

    请注意我的要求与其他类似问题的区别 此代码片段可将缺货商品保留在底部 在 Woocommerce 中最后显示缺货产品 https stackoverflow com questions 25113581 show out of stock
  • 当我将其设置为详细信息时,如何将图像添加到ListView?

    当我将其设置为详细信息时 如何将图像添加到 ListView 例如 ImageList imgList new ImageList imgList Images AddStrip bitmap this listView1 StateIma
  • 使用 OpenCv 检测 PC 上网络摄像头/摄像头的数量

    我正在制作一个运行多个网络摄像头 摄像机的应用程序 我无法检测到 OpenCV 拥有的网络摄像头数量 无法安排一个包含多个子网络摄像头的大显示窗口 有人可以帮我这个吗 我搜索过 openCV willowgarage 但失败了 thanks
  • Python线程传递参数

    我正在尝试将一些参数传递给服务器 但我不知道如何 这是我的代码 HOST PORT socket gethostbyname socket gethostname 31000 self server SocketServer Threadi
  • 通过html链接删除Django中的对象

    我有一个带有 Post 模型的项目 这是基本的帖子 我想在每个帖子页面上创建一个链接 以便能够删除该帖子 具有适当的安全性 关于堆栈溢出有一些问题 但我似乎找不到一个完整的 可行的答案 我使用的是 Django 1 7 当我实现它时不会抛出
  • 使用参数化类型重载方法

    只是想知道是否有一种方法可以使用参数化类型调用重载方法 例如定义以下对象 object Wrap def f x X println x called def f y Y println y called def f a Any print