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

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]

Error:(13,110) illegal inheritance;
self-type <*>[Q,R] does not conform to Quantity[_$1]‘s selftype Quantity[_$1]

06004

这有解决方法吗?我不介意在必要时重命名案例类,虽然我确实需要漂亮的中缀语法.

解决方法

问题是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).

(编辑:李大同)

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

    推荐文章
      热点阅读