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