国产提取器和案例类提取器的区别

2023-12-27

根据scala规范,由case类构建的提取器如下(scala规范§5.3.2):

def unapply[tps](x: c[tps]) =
  if (x eq null) scala.None
  else scala.Some(x.xs11, ..., x.xs1k)

出于实现原因,我希望能够在非案例类上模仿此提取器的行为。 但是,我的实现未能重现相同的行为。

这是我的差异的一个例子:

trait A

sealed trait B[X <: A]{ val x: X }

case class C[X <: A](x: X) extends B[X]

class D[X <: A](val x: X) extends B[X]

object D {
  def unapply[X <: A](d: D[X]): Option[X] =
    if (d eq None) None
    else Some(d.x)
}

def ext[X <: A](b: B[X]) = b match {
  case C(x) => Some(x)
  case D(x) => Some(x)
  case _ => None
}

我有以下警告:

<console>:37: warning: non variable type-argument X in type pattern D[X] is unchecked since it is eliminated by erasure
     case D(x) => Some(x)

请注意,警告仅发生在D情况,而不是情况类 texttractor 情况。 您是否知道警告的原因/我应该做什么来避免此警告?

Note:如果你想在 REPL 中测试它,最简单的方法是:

  1. 激活未检查的警告

    标量>:功率

    scala> settings.unchecked.value = true

  2. 要以粘贴模式复制以上代码:

    斯卡拉>:粘贴

    [复制粘贴]

    [Ctrl+D]

Edit:正如 Antoras 提到的,这应该是一个编译器错误,也许 scala 版本可能有用:scala 2.9.0.1 (经过快速测试,scala 2.9.1RC2 中仍然存在)


这似乎是一个编译器错误。我分析了编译器 AST 的输出(使用fsc -Xprint:typer <name_of_file>.scala)。它将两者解释为相同:

...
    final <synthetic> object C extends java.lang.Object with ScalaObject with Serializable {
      def this(): object test.Test.C = {
        C.super.this();
        ()
      };
      final override def toString(): java.lang.String = "C";
      case <synthetic> def unapply[X >: Nothing <: test.Test.A](x$0: test.Test.C[X]): Option[X] = if (x$0.==(null))
        scala.this.None
      else
        scala.Some.apply[X](x$0.x);
      case <synthetic> def apply[X >: Nothing <: test.Test.A](x: X): test.Test.C[X] = new test.Test.C[X](x);
      protected def readResolve(): java.lang.Object = Test.this.C
    };
...
    final object D extends java.lang.Object with ScalaObject {
      def this(): object test.Test.D = {
        D.super.this();
        ()
      };
      def unapply[X >: Nothing <: test.Test.A](d: test.Test.D[X]): Option[X] = if (d.eq(null))
        scala.None
      else
        scala.Some.apply[X](d.x)
    };
...

两种方法 unapply 的方法签名是相同的。

此外,代码运行良好(正如预期的那样,由于方法相同):

trait A {
  def m = "hello"
}

class AA extends A

sealed trait B[X <: A]{ val x: X }

case class C[X <: A](x: X) extends B[X]

class D[X <: A](val x: X) extends B[X]

object D {
  def apply[X <: A](x: X) = new D(x)
  def unapply[X <: A](d: D[X]): Option[X] =
    if (d eq null) None
    else Some(d.x)
}

def ext[X <: A](b: B[X]) = b match {
  case C(x) => Some("c:"+x.m)
  case D(x) => Some("d:"+x.m)
  case _ => None
}
println(ext(C[AA](new AA())))
println(ext(D[AA](new AA())))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

国产提取器和案例类提取器的区别 的相关文章

随机推荐

  • 检查多个文本字段是否为空 - iOS with Swift

    因此 我正在开发一个应用程序注册屏幕 我试图检查注册屏幕上的每个字段 看看它是否为空 如果是 则在标签中向用户显示错误消息 我一直在使用一系列 else ifs if self firstNameField text isEmpty nil
  • 共享工具提示的 Highcharts 工具提示格式

    例如 如果我有一个包含三个系列的图表 并且工具提示设置为共享 我希望对工具提示的格式设置有更多的控制 目前 我使用格式化程序 somefunction 并创建我自己的 html 以在显示的工具提示中使用 现在这工作得很好 但现在我希望能够知
  • 在什么情况下 CSRF 豁免会产生危险?

    这个问题更像是一个再保险问题 而不是直接关于如何编码的问题 作为一名自学者 我没有太多机会向专业人士询问此类问题 所以我在这里尝试 我已阅读 django docs 中的文档 https docs djangoproject com en
  • 如何让 Crontab 运行一个打开终端并执行操作的 Python 脚本?

    我想让 Crontab 运行Python特定时间的脚本 该 Python 脚本使用以下命令打开终端 subprocess 库并使用 Pyautogui 库编写内容 怎么做 我学Crontab一点点 让它与我的 Bash 脚本一起工作 它做了
  • Dplyr 变异最小列名

    我有一个包含许多列的 df 但对于这个问题 我重点关注四个日期列A B C D 我正在使用以下内容为该行的最小日期创建一列 mutate MIN DATE pmin A B C D 为该行的最小日期创建一列 A B C D MIN DATE
  • 2 个非同一地点的开发人员可以使用什么 git 工作流程?

    我有一份编写部分程序的合同 写另一部分的人在另一个城市 我想找到一种方便的方式来来回发送更改 由于其他原因 我想学习使用 git 作为分布式版本控制系统和电子邮件来回更改 我以前使用过 SCCS RCS 和 PVCS 总是使用锁定 我想督促
  • 通用单例包装类的设计

    我们正在弃用我们项目中的 ACE 库 该库由大约 120 个二进制文件组成 在许多二进制文件中我们使用了 ACE Singleton 由于弃用后我们将不再拥有此类 因此我们正在考虑在共享中编写我们自己的通用单例所有这些二进制文件都通用的库
  • 有什么工具可以捕获 C 代码中的愚蠢错误吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个令人讨厌的打字错误 浪费了我和同事的时间 它是这样的 for i 0 i lt blah i
  • SQL - 检索指定记录日期时间字段两侧 X 秒内出现的所有记录

    当我在 SQL 表中存储记录时 它会与 eventDateTime 一起存储 我想返回其 eventDateTime 为指定记录 eventDateTime 两侧 X 秒的所有记录 我已经尝试过 但它对我不起作用 我一事无成 Example
  • Angularjs:ng-选项分组依据

    我有这样的一级树情况
  • 如何使用 grails.plugin.location?

    我有一个插件项目 我创建为grails create plugin myPlugin 我还创建了一个 普通 grails 项目grails create app myPluginDemo 我正在尝试安装myPlugin插件myPluginD
  • 如何仅在模块上限制 VBA 功能

    我对VBA的了解很少并且正在努力学习它 我制作了一个VBA脚本 如下所示 Function doIt Dim c As int c callFunction End Function Function callFunction byVal
  • bash read循环仅读取输入变量的第一行

    我有一个读取循环正在读取变量 但行为不符合我的预期 我想读取变量的每一行并处理每一行 这是我的循环 while read r line do echo line sed s lt td gt lt td gt g cut d f2 3 4
  • 未找到“Facebook”类错误消息

    我为 facebook 应用程序复制了一些 html 代码 但我似乎收到以下错误 Fatal error Class Facebook not found in home content 73 7931773 html facebook a
  • 自定义 Java 初始屏幕“冻结”,直到整个应用程序加载完毕

    我有一个程序 需要很长时间才能加载 因此 我想开发一个闪屏 可以向用户提供有关正在加载的内容的反馈 一个带有图像 标签和 JProgressBar 的简单 JFrame 我一直在尝试 最好的结果是在我的main SwingUtilities
  • Tablix:在每个页面上重复标题行不起作用 - Report Builder 3.0

    我有一个 Tablix 其中有很多行跨越多个页面 我已设置 Tablix 属性在每个页面上重复标题行 但这不起作用 我在某处读到这是 Report Builder 3 0 中的一个已知错误 这是真的 如果没有 是否还需要做其他事情 这取决于
  • django-rest-framework :设置每个用户权限

    我使用 DRF 3 0 1 创建了 REST api 如果我使用权限类rest framework permissions IsAuthenticated 任何经过身份验证的用户都可以对任何用户执行 GET POST 等操作 只要他拥有有效
  • 查找集合中的重复条目

    是否有一个工具或库可以根据可以实现的特定标准查找集合中的重复条目 为了让自己清楚 我想根据特定标准对条目进行相互比较 所以我认为一个Predicate刚刚返回true or false还不够 我不能使用equals 这取决于标准的语义 如果
  • 带进度条的 R Shiny 异步

    Shiny 中的异步处理应该采用长时间运行的函数并将控制权交还给用户 然而 让用户知道计算正在后台运行仍然是件好事 我无法弄清楚如何构建异步进程以在后台运行并仍然显示进度指示器 下面是我一直在摆弄的示例代码 我认为进度指示器是一个问题 而且
  • 国产提取器和案例类提取器的区别

    根据scala规范 由case类构建的提取器如下 scala规范 5 3 2 def unapply tps x c tps if x eq null scala None else scala Some x xs11 x xs1k 出于实