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案例
