如何避免在 Scala 中调用 asInstanceOf

2024-03-13

这是我的代码的简化版本。

怎样才能避免打电话asInstanceOf(因为这是一个设计不佳的解决方案的味道)?

sealed trait Location
final case class Single(bucket: String)     extends Location
final case class Multi(buckets: Seq[String]) extends Location

@SuppressWarnings(Array("org.wartremover.warts.AsInstanceOf"))
class Log[L <: Location](location: L, path: String) { // I prefer composition over inheritance
  // I don't want to pass location to this method because it's a property of the object
  // It's a separated function because there is another caller
  private def getSinglePath()(implicit ev: L <:< Single): String = s"fs://${location.bucket}/$path"

  def getPaths(): Seq[String] =
    location match {
      case _: Single => Seq(this.asInstanceOf[Log[_ <: Single]].getSinglePath())
      case m: Multi  => m.buckets.map(bucket => s"fs://${bucket}/$path")
    }
}

尝试类型类

class Log[L <: Location](location: L, val path: String) {
  def getSinglePath()(implicit ev: L <:< Single): String = s"fs://${location.bucket}/$path"
  def getPaths()(implicit gp: GetPaths[L]): Seq[String] = gp.getPaths(location, this)
}

trait GetPaths[L <: Location] {
  def getPaths(location: L, log: Log[L]): Seq[String]
}
object GetPaths {
  implicit val single: GetPaths[Single] = (_, log) => Seq(log.getSinglePath())
  implicit val multi:  GetPaths[Multi]  = (m, log) => m.buckets.map(bucket => s"fs://${bucket}/${log.path}")
}

通常,类型类是模式匹配的编译时替代品。

我必须做getSinglePath公共和path a val为了提供对它们内部的访问GetPaths。如果您不想这样做,您可以将类型类嵌套到Log

class Log[L <: Location](location: L, path: String) {
  private def getSinglePath()(implicit ev: L <:< Single): String = s"fs://${location.bucket}/$path"
  def getPaths()(implicit gp: GetPaths[L]): Seq[String] = gp.getPaths(location)

  private trait GetPaths[L1 <: Location] {
    def getPaths(location: L1): Seq[String]
  }
  private object GetPaths {
    implicit def single(implicit ev: L <:< Single): GetPaths[L] = _ => Seq(getSinglePath())
    implicit val multi: GetPaths[Multi] = _.buckets.map(bucket => s"fs://${bucket}/$path")
  }
}

其实我们不必通过location明确地,我们不需要L1

class Log[L <: Location](location: L, path: String) {
  private def getSinglePath()(implicit ev: L <:< Single): String = s"fs://${location.bucket}/$path"
  def getPaths()(implicit gp: GetPaths): Seq[String] = gp.getPaths()

  private trait GetPaths {
    def getPaths(): Seq[String]
  }
  private object GetPaths {
    implicit def single(implicit ev: L <:< Single): GetPaths = () => Seq(getSinglePath())
    implicit def multi(implicit ev: L <:< Multi):   GetPaths = () => location.buckets.map(bucket => s"fs://${bucket}/$path")
  }
}

Now GetPaths是零参数类型类别 https://kubuszok.com/2018/implicits-type-classes-and-extension-methods-part-1/#type-classes-in-scala和稍微相似磁铁图案 https://kubuszok.com/2018/implicits-type-classes-and-extension-methods-part-3/#magnet-pattern.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何避免在 Scala 中调用 asInstanceOf 的相关文章

随机推荐

  • 其可能的 Google 表单脚本每天上午 00:01 至中午 12:00 自动打开和关闭

    我想每天 00 01 打开 google 表单并在 12 00 关闭 这是我的代码 function createDailyTrigger ScriptApp newTrigger openCloseFormTrigger timeBase
  • 由于 Integer.parseInt 导致崩溃

    我正在尝试从另一个文本文件中生成的文本导入文本Activity 生成的文本文件由String ArrayList其中仅包含数字和 Android 生成的其他随机文本 当我从文件导入文本时 我使用的是BufferedReader and re
  • 如何在Python中检查神经网络的层数以及何时应该增加层数?

    请对您的想法添加最少的评论 以便我可以改进我的查询 谢谢 我正在研究MNIST数据集并写一些CNN代码 然而 我对其中的一些观点感到困惑CNN代码 如何知道神经网络的层数 根据我目前的理解 我认为它有 6 层和 4 个隐藏层 是对的吗 如果
  • OpenGL 3:​​glBindVertexArray 使 GL_ELEMENT_ARRAY_BUFFER 无效

    我确信如果你通过绑定缓冲区glBindBuffer 您可以放心地假设它保持绑定状态 直到目标通过另一个调用反弹glBindBuffer 因此 当我发现调用时 我感到非常惊讶glBindVertexArray 将绑定到 GL ELEMENT
  • 在 Node 中渲染 HTML 字符串?

    好吧 我已经下载了 Express 设置端口process env PORT 8080 并设置应用程序变量var app express 现在 我想要完成的是不是通过文件渲染 HTML 我可以通过字符串来完成吗 var html n n n
  • 将 Word 保存为 UTF-8 编码的 HTML

    我正在编写一些 C VSTO 代码 用于读取 Microsoft Word 文档并将其保存到筛选的 HTML 当我对通用 Word 文档执行此函数时 html 文件的输出使用 Windows 字符集 如下所示 如果我打开一个文档并转到 文件
  • 自定义验证摘要模板 Asp.net MVC 3

    我正在开发一个使用 Asp Net MVC3 的项目 在我的视图中 Html ValidationSummary true 像往常一样它会产生 div class validation summary errors ul li Someth
  • Twinx/Secondary-y:不要从第一种颜色开始

    我有一个配色方案来自 plt style use ggplot so 我不想手动选取颜色 或从颜色循环器中选取它们 但是 当我有辅助轴时 fig ax plt subplots ax2 ax twinx ax plot np array 1
  • Scala 泛型和数字隐式

    我需要将两个函数作为参数传递给 scala 函数 然后 该函数应该评估它们并从中获取一个数字 然后对其进行操作 该数字可以是 Int Double 或任何其他数字类型 我希望该函数能够工作 无论它使用什么类型 下面的例子解释了这个问题 im
  • Android 中访问错误的原始资源

    我有以下代码 我的想法是在 OnCreate 中 我会将 res raw 中的文本文件中的一些类别填充到我的数据库中 首先按行对读取的文件进行标记 myCatToken 然后我再次拆分每个文件以获取 id 和名称 由于某种原因 我没有读取r
  • 如何仅从元素的一侧删除边框?

    I have
  • ReferenceError getValuesOfAutofillInputs,找不到变量:PaymentAutofillConfig [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 自 2022 年 6 月 2 日以来 我们的哨兵日志中一直面临代码中的引用错误 而且它只发生在 iOS iphone 设
  • 如何向网站发送查询并解析结果?

    我想用Java做一些开发 我希望能够访问一个网站 例如 www chipotle com 在右上角 您可以输入邮政编码 它会为您提供所有最近的位置 该程序只有一个空框供用户输入邮政编码 并且它将查询实际的 chipotle 服务器以检索最近
  • R 中值的累积计数

    我希望你做得很好 我想知道如何计算特定条件下数据集的累积和 我的数据集的简化版本如下所示 t id A 22 A 22 R 22 A 41 A 98 A 98 A 98 R 98 A 46 A 46 R 46 A 46 A 46 A 46
  • 在日期/因子向量字段上使用 sapply - 包括递增值

    我有一个带有缺失值的日期字段 因子类转换为字符串 我想用每个缺失值的序列号来填充该字段 到目前为止 这是我的代码 f lt function x counter if x counter counter 1 return toString
  • 非阻塞 BIO_do_connect 当没有互联网连接时被阻塞

    我使用 Openssl 0 9 8x 如下 bio BIO new ssl connect ctx BIO get ssl bio ssl SSL set mode ssl SSL MODE AUTO RETRY BIO set nbio
  • 如何在黑莓中裁剪特定形状的图像?

    大家好 感谢阅读我的回答希望你能帮助我 我正在黑莓手机上进行图像裁剪 在我的应用程序中包含 3 个主要内容 1 将图像加载到屏幕上 2 选择裁剪区域的形状 3 在下一个屏幕上显示裁剪图像而不丢失其形状 第1步 我可以完成图像加载部分 步骤2
  • Tweepy:现在可以使用 Twitter 搜索 api 获取旧推文了吗?

    根据http www theverge com 2014 11 18 7242477 twitter search now lets you find any tweet ever sent http www theverge com 20
  • 使用批处理文件按键盘按键[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在尝试开发一个批处理文件 它可以自动按向左箭头和向右箭头键 n 次 中间有一些暂停 有人可以帮我解决这个问题吗 P
  • 如何避免在 Scala 中调用 asInstanceOf

    这是我的代码的简化版本 怎样才能避免打电话asInstanceOf 因为这是一个设计不佳的解决方案的味道 sealed trait Location final case class Single bucket String extends