加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读