scala – 用隐式证据约束一个类
发布时间:2020-12-16 18:38:16 所属栏目:安全 来源:网络整理
导读:说我有这个: trait Animal { type Species } 我可以很容易地编写一个只需要同一物种的两只动物的功能 def breed(a: Animal,b: Animal)(implicit evidence: a.Species =:= b.Species) = ??? 但我想创建一个具有相同类型约束的类: class Bed(a: Animal,b: An
说我有这个:
trait Animal { type Species } 我可以很容易地编写一个只需要同一物种的两只动物的功能 def breed(a: Animal,b: Animal)(implicit evidence: a.Species =:= b.Species) = ??? 但我想创建一个具有相同类型约束的类: class Bed(a: Animal,b: Animal)(implicit evidence: a.Species =:= b.Species) 但它不会编译.我尝试了一些尝试使用具有稳定标识符和约束的特征的组合,但不管怎么样,但无论我做什么 – 我似乎总是遇到问题 trait Bed { type T def a: Animal { type Species = T } def b: Animal { type Species = T } } object Bed { def apply(a1: Animal,b1: Animal)(implicit ev: a1.Species =:= b1.Species) = new Bed { type T = b1.Species def a = a1 // this line won't compile,as the compiler can't see the two species are equal ? def b = b1 } } 谢谢. 解决方法
您可以通过Bed.apply上的类型参数表示约束,而不是通过类型相等约束,
object Bed { def apply[T1]( a1: Animal { type Species = T1 },b1: Animal { type Species = T1 }) = new Bed { type T = T1 def a = a1 def b = b1 } } 借助类型别名可以做到这一点, type AnimalAux[S] = Animal { type Species = S } object Bed { def apply[T1](a1: AnimalAux[T1],b1: AnimalAux[T1]) = new Bed { type T = T1 def a = a1 def b = b1 } } 示例REPL会话, scala> trait Dog defined trait Dog scala> val tigger = new Animal { type Species = Dog } tigger: Animal{type Species = Dog} = $anon$1@64bd8f9c scala> val zebedee = new Animal { type Species = Dog } zebedee: Animal{type Species = Dog} = $anon$1@61f2bf35 scala> Bed(tigger,zebedee) res0: Bed{type T = Dog} = Bed$$anon$1@2b0ce330 scala> val b = Bed(tigger,zebedee) b: Bed{type T = Dog} = Bed$$anon$1@681c81de (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 小而简单的LDAP服务器作为OpenLDAP的替代方案
- angular Can't resolve '../fonts/glyphicons-h
- angular – 延迟加载的DLL
- angularjs – 使用服务以角度在多个控制器之间共享ajax数据
- bash – 检查while循环中调用的程序的退出代码
- 《数据结构》第一章 绪论 知识结构导图——信管1133-09
- 使用bash或python或其他一些linux命令行工具创建一个doveco
- angular – Chrome每次在.ts文件中添加断点时都会在main.bu
- Angular 2中的依赖注入
- bootstrap日期插件官方文档与demo案例