Scala:在编译时验证类参数不是instanceOf特征

2023-11-30

在编译时,我想验证类参数不是特定特征 T 的实例。我知道如何在运行时使用require or a case match但想知道如何在编译时完成此操作以防止用户提供某种类型的对象混合。

我研究过 scala 宏/反射,但无法完全理解它。

trait A
trait B
trait T
abstract class C extends A with B

case class P(c: C){
  require(!c.isInstanceOf[T]) // how to do this at compile time ?
}

// usage as below
object c1 extends C
object c2 extends C
object c3 extends C
object c4 extends C with T

val l = List(c1, c2, c3, c4).map(k => P(k)) // should fail at compile time

你不能这样做List。中的所有元素List(c1, c2, c3, c4)将是相同的类型,即C以及其中之一具有类型的信息C with T会迷路。

new C {}, new C with T {}是运行时值c1, c2, c3, c4,编译器在编译时无权访问它们List(c1, c2, c3, c4).

你可以这样做HList. Using shapeless.<:!<, shapeless.ops.hlist.LiftAll和善良的投影仪

def noElementIsSubtypeOfT[L <: HList](l: L)(implicit liftAll: LiftAll[* <:!< T, L]) = null

noElementIsSubtypeOfT(c1 :: c2 :: c3 :: HNil) // compiles
// noElementIsSubtypeOfT(c1 :: c2 :: c3 :: c4 :: HNil) // doesn't compile

Or

def noElementIsSubtypeOfT[L <: HList : LiftAll[* <:!< T, *]](l: L) = null

对于类参数你可以这样做

case class P[U <: C](c: U)(implicit ev: U <:!< T)

P(c1) // compiles
P(c2) // compiles
P(c3) // compiles
// P(c4) // doesn't compile

or

case class P[U <: C : * <:!< T](c: U)

其实,有一种方法可以用List来修复代码。你可以上课P隐式(因此您定义隐式转换)并指定列表的类型List[P[_]](...)(所谓的磁铁图案1 2 3 4 5 6 7, P是一块磁铁)

implicit class P[U <: C](c: U)(implicit ev: U <:!< T)

List[P[_]](c1, c2, c3) // compiles

List[P[_]](c1, c2, c3, c4) // doesn't compile, type mismatch: found: c4.type, required: P[_]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala:在编译时验证类参数不是instanceOf特征 的相关文章

随机推荐

  • 为什么cout<

    为什么cout lt
  • 将十六进制字符串解析为整数会引发 NumberFormatException?

    所以 在 Java 中 您知道如何声明整数 如下所示 int hex 0x00ff00 我认为你应该能够扭转这个过程 我有这个代码 Integer valueOf primary getFullHex 其中 Primary 是自定义 Col
  • jna 平台中的 NoSuchMethodError

    我想发布应用程序的新版本 但启动时它会抛出 NoSuchMethodError java lang NoSuchMethodError com sun jna Native load Ljava lang String Ljava lang
  • Three.js:更改精灵的枢轴点

    我创建了一张 3D 地图 并通过 Sprites 在这张地图上标记点 除了精灵标签的定位之外 这本身工作得很好 因为我正在创建地图 所以相机可以从 0 度倾斜到 90 度 而理想情况下 标签始终在屏幕上标记的项目正上方保持一定距离 但不幸的
  • 使用
    标记外部的按钮提交表单

    假设我有
  • 尝试保存到 NSUserdefaults 时出错

    我有一个按以下方式工作的表 如果选择一行 则将与所选行对应的金额添加到var total 添加一个复选标记 如果取消选择 金额将被减去 复选标记将设置为无 在尝试将数据保存到 NSUserDefaults 或从 NSUserDefaults
  • 无法进行跨域 Ajax 调用

    文档 ready 函数 ajax 网址 http gdata youtube com feeds api users zdf playlists v 2 类型 获取 成功 函数 消息 控制台 log 消息 我收到此错误 XMLHttpReq
  • 将选择选项和 optgroup 存储在 JavaScript 数组中

    我正在制作一个循环 html select 的 jQuery 插件
  • GORM 无法认识到插件中的域类是 GORM 类

    我正在尝试使用 Grails 项目作为插件 基本上将我的域类放在插件中 然后在多个 Grails 项目中使用它们 我已经这样做了 grails 创建应用程序 web grails 创建应用程序插件 在两个项目的根目录中创建一个setting
  • R 自定义包安装文件错误

    我一直在为一个模拟项目开发 R 包 在我家里的计算机上我已经使用 RStudio 成功构建并安装了它 然而 在大学的另一台机器上 我遇到了麻烦 如果我尝试在 RStudio 中构建一个二进制文件 它也会安装它 我会收到一个错误 如果我只是编
  • AVD 管理器无法找到 tools\android.bat,即使它在那里

    我在互联网上对此进行了很多研究 但我发现没有任何东西可以帮助我 我让 SDK 管理器运行 但是当我尝试运行 Adroid AVD 管理器时 它不运行 为什么 它一字一句地说 无法执行tools android bat 该系统找不到指定的文件
  • 如何更改javafx中滑块的填充颜色

    我正在制作一个视频播放器 想要使用时间线滑块 并且我想将滑块从第一张图片更改为第二张图片 我可以只使用CSS代码来做到这一点吗 如果是的话 代码是什么 下面很长的帖子 如果您想要一种简单的方法来实现滑块上的 颜色 我应该提到您可以使用JFo
  • 如何绕过权限被拒绝错误?

    以下示例将点形状文件写入光盘 但是 当脚本尝试将 shapefile 写入 C 时 我收到错误 我可以写入外部硬盘 G 以下是我在 R 中收到的错误 文件错误 out name wb 无法打开连接 另外 警告消息 在文件 out name
  • 有条件地选择多个(相邻)行

    我想返回符合特定条件的行 我可以对单行执行此操作 但我需要对多行组合执行此操作 例如 浅绿色 符合 XYZ 为正且 总计 gt 10 的条件 而 红色 则不然 当我组合相邻的一行或多行时 它确实 gt 深绿色 我可以实现遍历所有行而不返回重
  • 为什么当 Tomcat 加载和读取 beans.xml 时 Spring AOP XML 模式没有正确加载

    我正在尝试使用Spring 基于模式的 AOP 支持在 Eclipse 中 尝试在 Tomcat 中加载配置时出现错误 Eclipse 中没有错误 并且 aop 命名空间的自动完成功能正常工作 但是当我尝试将项目加载到 Eclipse 中时
  • 如何通过互联网连接TFS

    我正在团队环境中开发一个大型应用程序 我们使用 Team Foundation Server 来通过 VS2010 控制源代码 我们使用 LAN 连接 TFS 这在小型办公室中效果很好 但现在我们需要通过 Internet 连接 TFS 实
  • 如何重写 ParsePushBroadcastReceiver 的 onPushReceive() ?

    我正在使用 Parse com 的推送通知服务 根据doc 覆盖 onPushReceive 以触发 静默 后台操作 推动 我找到了onPushOpen 的源代码here 但现在我必须重写 onPushReceive 来自定义声音和振动的行
  • Spark 中 addJar() 方法有什么用?

    在Spark作业中 我不知道如何导入和使用方法共享的jarSparkContext addJar 似乎这种方法能够将 jar 移动到集群中其他节点可以访问的某个位置 但我不知道如何导入它们 这是一个例子 package utils publ
  • 如何使用 Beautiful Soup 查找具有特定文本的标签?

    怎么找text I am looking for在以下 HTML 中 标有换行符 n tr td class pos n Some text n br n strong some value strong n td tr tr td cla
  • Scala:在编译时验证类参数不是instanceOf特征

    在编译时 我想验证类参数不是特定特征 T 的实例 我知道如何在运行时使用require or a case match但想知道如何在编译时完成此操作以防止用户提供某种类型的对象混合 我研究过 scala 宏 反射 但无法完全理解它 trai