如何定义类型参数不能为 Any 的 scala 方法

2023-11-25

在下面的示例中,我想定义一个contains无法编译的方法a and b不属于同一基本类型。

  • In contains1暗示,如果a is Seq[Int]b 是String, T导出为Any,并且它可以编译。这不是我想要的。
  • In contains2暗示,如果a is Seq[Int]b 是String,那么它就无法编译。这种行为就是我想要的。
def contains1[T](a: Seq[T], b: T): Boolean = a.contains(b)

println(contains1(Seq(1,2,3), "four")) // false

def contains2[T: Ordering](a: Seq[T], b: T): Boolean = a.contains(b)

println(contains2(Seq(1,2,3), "four")) // compilation error
// cmd7.sc:1: No implicit Ordering defined for Any.
// val res7 = isMatched(Seq(1,2,3), "s")
                    ^
// Compilation Failed

但是,是否有更简单的方法来实现与中相同的行为contains2? Ordering上下文绑定让我感到困惑,因为该方法与排序/排序根本无关。


你可以使用广义类型约束操作员=:=.

例如:

def contains[A,B](a: Seq[A], b: B)(implicit evidence: A =:= B): Boolean = a.contains(b)

进而:

println(contains1(Seq(1,2,3), "four")) //fails with Cannot prove that Int =:= String.
println(contains1(Seq("one"), "four")) //returns false
println(contains1(Seq("one", "four"), "four")) //true

有关广义类型约束的更多信息here and here.

正如 LuisMiguelMejíaSuárez 注意到的,您也可以考虑使用B <:< A代替A =:= B。我不会详细说明这两者之间的差异,因为它在链接的答案和文章中进行了描述,但简而言之,<:<也将允许所有B这是一个子类型A, while =:=需要类型完全匹配。

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

如何定义类型参数不能为 Any 的 scala 方法 的相关文章

随机推荐

  • 用于查找使用过多 CPU 的进程的命令[关闭]

    Closed 这个问题是无关 目前不接受答案 我可以使用什么命令来查找使用大量 CPU 的进程 我可以在不安装新东西的情况下执行此操作吗 或者使用您可以执行的其他一些实用程序 ps aux sort rk 3 3 head n 5 更改 h
  • 在 SQL Server 2005 中如何将多行组合成逗号分隔的列表?

    现在 我有一个像这样的 SQL 查询 SELECT X Y FROM POINTS 它返回的结果如下 X Y 12 3 15 2 18 12 20 29 我想在一行中返回所有结果 如下所示 适合在 HTML 标记中使用 XYLIST 12
  • Angularjs - 如何清除 $routeProvider 的 templateUrl 缓存

    我的应用程序中有非常基本的用例 其中我使用 AngularJS 1 0 8 作为前端 使用 Grails 作为后端 在应用程序布局中 我有一个语言切换器 允许用户更改语言 切换语言后 它会执行新的 http 请求来检索页面 Grails 会
  • Django - 模板显示模型 verbose_names 和对象

    我需要在模板中显示多个模型名称和对象 这是我的view def contents request Lists contents objects Model1 objects all Model2 objects all Model3 obj
  • PHP 函数重命名权限被拒绝

    在服务器中 脚本创建新文件夹 将 chmod 设置为 0777 但随后它尝试将文件移动到该文件夹 但出现错误 权限被拒绝 mkdir new 1 0777 chmod new 1 0777 mkdir new 1 new 2 0777 ch
  • 如何在 JavaScript 中获取两个日期之间的差异?

    我正在创建一个应用程序 它可以让您定义带有时间范围的事件 我想在用户选择或更改开始日期时自动填写结束日期 但是 我不太清楚如何获得两个时间之间的差异 以及如何使用该差异创建新的结束日期 在 JavaScript 中 可以通过调用将日期转换为
  • Font Awesome 未出现在 Internet Explorer 8 中

    我们最近开发了一个网站 其设计强烈依赖 Font Awesome 我们使用 before content 及其提供的 CSS 的标准实现 由于某些原因 Font Awesome 未在 IE8 中显示 我花了相当多的时间进行故障排除并尝试各种
  • jQuery:如何在元素显示时调用函数

    我想在 div 显示时 显示后 调用一个函数 有谁知道我该怎么做 我尝试使用类似的东西 someDiv bind show function alert example 但我不确定我是否以正确的方式做到这一点 或者是否可能实现这一点 有任何
  • Java 可以在运行时创建变量吗?

    例如 假设我想 提取 String fruits Pear Banana Apple 分成三个独立的变量 例如 for int i 0 i fruits length i of course there s no eval in Java
  • 如何在 Java 中表示一个范围?

    假设一个整数应该在以下范围内 0 2147483647 我想检查整数变量是否落在这个范围内 我知道它可以通过一个简单的 if else 语句来完成 但是有没有更有效的方法来检查它是否在范围内 我宁愿不这样做 if foo gt 0 foo
  • 用于正确对齐列的 Shell 脚本

    我有一个 3 列 制表符分隔的文件 例如 activity log manager Manager reserve rm hreserver rm log manager Manager mo apprv mgr1 Approving Ma
  • keras.load_model() 无法识别 Tensorflow 的激活函数

    我使用保存了 tf keras 模型tf keras save model功能 为什么tf keras load model抛出异常 代码示例 import tensorflow as tf from tensorflow import k
  • 页面上存在一个或多个错误

    收到 页面上存在一个或多个错误 但无法找到确切的错误 这是截图 Edit 1 我正在尝试上传尺寸为 1536 x 2048 像素的 iPad 屏幕截图 以获取最大高分辨率肖像 全屏 并锁定 但出现奇怪的错误 如下所示 注意 我尝试从 chr
  • 从 HTML
    到 Microsoft Word

    我有一个 HTMLfigure img and figcaption标签 我想将它们转换为 Microsoft Word 文档 所引用的图像img应该插入到Word文档中 并且figcaption应转换为其标题 也保留图号 我尝试用 Wor
  • 如何使用公钥加密字符串并使用私钥解密?

    我想用服务器上的密钥加密密码并在服务器端解密加密的密码 这是我在我的应用程序中使用的代码 To change this license header choose License Headers in Project Properties
  • 增加android模拟器的内存容量?

    如何增加Android模拟器的内存容量 我有一个 16MB 的二进制文件 我必须解析它 但是当我第二次执行时它说 Installation error INSTALL FAILED INSUFFICIENT STORAGE 有人可以帮忙吗
  • 我怎样才能在vim中快速输入像“==========”这样的行

    我正在编辑重组文本文件 我经常需要在一行中放置一些字符 例如 并且我希望该行的长度与前一行匹配 我应该如何在 vim 中执行此操作 a long long title Thanks 另一个可行的方法 yypv r
  • C# FileStream:写入大文件的最佳缓冲区大小?

    假设我正在将几个文件写入磁盘 大小在 2MB 到 5GB 之间 FileStream 的合理缓冲区值是多少 使用几兆字节的缓冲区大小是否明智 或者我应该坚持使用千字节缓冲区 默认缓冲区大小为 4 KiB 另外 请看这里 NET 的顺序文件编
  • NSWidgetExtensionContext openURL Swift

    我一直在尝试实现一个按钮来从其小部件打开我的 iOS 应用程序 我意识到这个问题已经在论坛上被打败了 但我找不到我收到的具体错误的解释 也许你们中一些更有经验的 iOS 开发人员可以对此做出一些解释 我正在使用 XCode 8 1 和 Sw
  • 如何定义类型参数不能为 Any 的 scala 方法

    在下面的示例中 我想定义一个contains无法编译的方法a and b不属于同一基本类型 In contains1暗示 如果a is Seq Int b 是String T导出为Any 并且它可以编译 这不是我想要的 In contain