scala – 是否可以创建一个可以用作T [A,B]的泛型类型T [A <
发布时间:2020-12-16 18:30:48 所属栏目:安全 来源:网络整理
导读:我有以下案例类: case class *[Q : Quantity[T],R : Quantity[T],T](value: T) extends Quantity[T] 我想这样使用它: type Area[T] = Length[T] * Length[T] 但是,我收到的错误是 *期待三个参数,我只给了两个.我希望它能像这样工作: type Area[T] = *[Len
我有以下案例类:
case class <*>[Q <: Quantity[T],R <: Quantity[T],T](value: T) extends Quantity[T] 我想这样使用它: type Area[T] = Length[T] <*> Length[T] 但是,我收到的错误是< *>期待三个参数,我只给了两个.我希望它能像这样工作: type Area[T] = <*>[Length[T],Length[T],T] 我尝试了以下但它给了我一个错误: trait Quantity[T] { type Value = T def value: T } case class <*>[Q <: Quantity[_],R <: Quantity[_]](value: Q#Value) (implicit eq: Q#Value =:= R#Value) extends Quantity[Q#Value]
这有解决方法吗?我不介意在必要时重命名案例类,虽然我确实需要漂亮的中缀语法. 解决方法
问题是Q#Value引用.
我建议使用隐式来强制执行类型约束,而不是尝试使存在性工作: sealed trait CanStar[Q,R] // could include =:=-like values in CanStar if you like object CanStar { implicit def canStar[Q <: Quantity[T],T] = new CanStar[Q,R]{} } sealed case class <*>[Q,R](value: Q)(implicit cs: CanStar[Q,R]) 然后< *>是所需的双参数类型,但您只能实例化Q< *>. R与Q和R适当相关(因为隐含的CanStar [Q,R] s仅适用于合适的Q和R). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |