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

联合类型绑定到特征的类型参数(scala)

发布时间:2020-12-16 08:51:34 所属栏目:安全 来源:网络整理
导读:如何将特征的类型参数约束为一组不同的类型(例如,由联合类型约束)? 作为一个具体的例子,我想创建一个特征IntegralIndex [T],其中T必须为Int或Long. 我尝试了this question on union types的第一个答案: sealed abstract class NumericIndex[T]object Numer
如何将特征的类型参数约束为一组不同的类型(例如,由联合类型约束)?

作为一个具体的例子,我想创建一个特征IntegralIndex [T],其中T必须为Int或Long.

我尝试了this question on union types的第一个答案:

sealed abstract class NumericIndex[T]
object NumericIndex {
  implicit object IntWitness extends NumericIndex[Int]
  implicit object LongWitness extends NumericIndex[Long]
}

trait IntegralIndex[T : NumericIndex]

但这不起作用;我得到的特征不能有带上下文边界的类型参数`:…’也不能查看边界`<%...' 还有其他建议吗?不可否认,我不理解关于工会类型问题的其他解决方案,所以如果答案只是在那里使用不同的答案,或者甚至知道无法完成,我会很感激.

解决方法

类型类方法可能是在这里完成您想要的最简洁的方法,并且您的版本正确.它不能以当前形式工作,因为上下文边界只是隐式参数的语法糖.以下特征定义,例如:

trait IntegralIndex[T: NumericIndex]

会不会喜欢这样的事情:

trait IntegralIndex[T](implicit num: NumericIndex[T])

但是traits没有构造函数,所以这不是有效的Scala语法.但是,你可以这样写:

trait IntegralIndex[T] {
  implicit def num: NumericIndex[T]
}

这确保您无法创建IntegralIndex [T],除非您有证据表明存在T的NumericIndex类型类的实例.

现在,当您实现IntegralIndex时,您可以编写:

case class MyIndex[T](whatever: String)(implicit val num: NumericIndex[T])

要么:

case class MyIndex[T: NumericIndex](whatever: String) {
  implicit val num = implicitly[NumericIndex[T]]
}

现在,对于使用MyIndex的任何人来说,所有隐式管道都是不可见的.

(编辑:李大同)

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

    推荐文章
      热点阅读