确保隐式定义始终具有较高/较低优先级的一般方法

2024-04-25

我有一个有点复杂的类型类情况,格式如下:

sealed trait TypeClass[S <: MyType] {
  type Out <: MyType
}

sealed trait LowPriorityTypeClass {
  // Case: OtherTypeClass is NOT defined for the input type S.
  // The output type is the same as the input type.
  implicit def default[S <: MyType]: TypeClass.Aux[S, S] = ???
}

object TypeClass extends LowPriorityTypeClass {
  type Aux[S <: MyType, O <: MyType] = TypeClass[S] { type Out = O }

  // Case: OtherTypeClass is defined for the input type S.
  // The output type is the same as in the OtherTypeClass definition.
  implicit def hasOtherTC[S <: MyType, O <: MyType](
    implicit otherTC: OtherTypeClass.Aux[S, O],
  ): TypeClass.Aux[S, O] = ???
}

The default定义被放入LowPriorityTypeClass具有较低优先级的特征。然而,含糊不清hasOtherTC对于某些类型仍然会发生S,显然是因为声明default比声明更具体hasOtherTC对于该类型S.

有没有general确保隐式定义始终比其他定义具有更高/更低优先级的方法? (我的问题不是针对上面的具体代码。)

让我知道发布更完整的示例代码是否有帮助。


请参见为什么会发生这种隐含的歧义行为? https://stackoverflow.com/questions/57933865/why-is-this-implicit-ambiguity-behaviour-happening/包括评论。

引入特质是没有意义的LowPriorityTypeClass在这种情况下,因为无论如何隐式default比更具体hasOtherTC.

没有通用的方法。您可以使用类型类Not (shapeless.Refute, implicitbox.Not) or shapeless.LowPriority, implicitbox.Priority或图书馆https://github.com/milessabin/export-hook https://github.com/milessabin/export-hook.

object TypeClass {
  type Aux[S <: MyType, O <: MyType] = TypeClass[S] {type Out = O}

  implicit def hasOtherTC[S <: MyType, O <: MyType](implicit
                                                    otherTC: OtherTypeClass.Aux[S, O]
                                                   ): TypeClass.Aux[S, O] = ???

  implicit def default[S <: MyType](implicit 
                                    noOtherTC: Refute[OtherTypeClass[S]]
                                   ): TypeClass.Aux[S, S] = ???
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

确保隐式定义始终具有较高/较低优先级的一般方法 的相关文章

随机推荐

  • 一个包中的多个模块导入一个公共模块

    我正在写一个 python 包 我使用插件的概念 每个插件都是 Worker 类的专门化 每个插件都被编写为模块 脚本 并在单独的进程中生成 由于插件之间的基本共性 例如 所有插件都扩展基类 Worker 插件模块通常如下所示 import
  • 为什么 VBA 中的 GetValue 函数使用单元格“A1”?

    我正在使用此函数从关闭的工作簿中检索值 在此代码的第 8 行中 我不明白为什么使用 A1 整个第 8 行到底发生了什么 我也对 xlR1C1 的论点感到困惑 Private Function GetValue path file sheet
  • 使用 C# 将 JSON 字符串从 Camel 大小写转换为 Pascal 大小写

    我有一个 JSON 字符串 它的密钥采用驼峰式大小写形式 但我需要将密钥转换为帕斯卡式大小写 实际的 JSON 字符串 string jsonString personName firstName Emma lastName Watson
  • Android TabWidget 检测当前选项卡的点击

    我正在尝试找到一种方法 当该选项卡是当前选项卡时 能够在该选项卡上触发 onclick 事件 我确实尝试过这种方式 以及其他几种方式 但没有成功 public void onTabChanged String tabId Log d thi
  • 在 Java 中使用 JSON 的 HTTP POST

    我想在 Java 中使用 JSON 制作一个简单的 HTTP POST 假设网址是www site com 它接受值 name myname age 20 标记为 details 例如 我将如何创建 POST 语法 我似乎也无法在 JSON
  • 背景 x 重复负边距重叠

    实际上是我关于堆栈的第一个问题 我试图在重复背景上获得负 右 边距 这样重复图像之间就不会出现间隙 似乎没有 CSS 语法来实现这一点 为了清楚起见 我在下面添加了一张图片 所以我试图让类似饼干的东西的重复图像重叠 这样它们之间就没有间隙
  • 如果我们在更大的表中使用广播会发生什么?

    我想知道如果我们广播较大的表并将其加入到较小的表中会发生什么 另外 如果我们有两个同样大的表 在这种情况下使用广播连接会发生什么 有几件事需要考虑 火花上限 Spark支持最大8GB的广播表 如果你的广播对象超过这个数量 它就会失败 驱动程
  • 最新的CEDET版本无法加载语义包

    我在加载 Alex Ott 推荐的一些语义包时遇到问题他著名的 CEDET 指南 http alexott net en writings emacs devenv EmacsCedet html使用最新版本的 CEDET 时 我之前的设置
  • 在Python 3中从CGI输出二进制数据

    这个问题与this one https stackoverflow com q 908331 554319 我在从 Python 2 中的 CGI 脚本打印原始二进制数据时没有遇到任何问题 例如 usr bin env python2 im
  • 一元加号和减号运算符的重要用途是什么?

    如果一元 运算符用于执行转换Number 转换函数 那么为什么我们需要一元运算符呢 这些一元运算符有什么特殊需要 一元论 运算符将其操作数转换为 Number 类型 一元论 运算符将其操作数转换为 Number 类型 然后将其取反 根据EC
  • Sublime 代码折叠注释(如 Ace 中)

    在 Cloud9 基于 Ace 编辑器 中 我可以在注释中定义任意代码折叠区域 例如 Descriptor function Code 折叠为 Descriptor lt gt 在这里尝试看看我的意思 http ace c9 io buil
  • ModelClientValidationRule 冲突

    我已将 vs 2011 开发人员预览版与 vs 2010 并排安装 现在 当我在 vs 2010 中运行我的 asp net mvc 3 项目时 我在使用 ModelClientValidationRule 的项目中收到以下错误 Syste
  • 在线代码美化器和格式化程序[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在一个函数中返回两个变量[重复]

    这个问题在这里已经有答案了 考虑以下代码 demo http jsfiddle net m59Fg function test var h Hello var w World return h w var test test alert t
  • Mono 与 CompletableFuture

    CompletableFuture在单独的线程上执行任务 使用线程池 并提供回调函数 假设我有一个 API 调用CompletableFuture 这是 API 调用阻塞吗 线程会被阻塞直到它没有从 API 得到响应吗 我知道主线程 tom
  • 这是从片段中获取字符串资源的正确方法吗?

    在片段中读取字符串资源时 哪种方法通常更好 更安全 我在这里读到getResources getString 直接地 public class SomeFragment extends Fragment public static Some
  • C# - 从客户端检查 TCP/IP 套接字状态

    我想为我的 TCP IP 客户端类提供 CheckConnection 函数 以便我可以检查是否发生了错误 我自己的客户端断开连接 服务器断开连接 服务器卡住等 我有类似的东西 bool isConnectionActive false i
  • 无法在网络视图中滚动图像

    我为 Android 和 iOS 开发了一个 webview 应用程序 我注意到我无法滚动 Android 应用程序中的特定 html 元素 而它可以在 iOS 上运行 这是website https www blizz z de flex
  • 一个 pom 中的多个工件 ID

    有一个maven项目 jar 但现在需要将其分成两个工件 我想要两个像下面这样的 Maven 工件
  • 确保隐式定义始终具有较高/较低优先级的一般方法

    我有一个有点复杂的类型类情况 格式如下 sealed trait TypeClass S lt MyType type Out lt MyType sealed trait LowPriorityTypeClass Case OtherTy