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

scala – 类型参数化或结构子类型或

发布时间:2020-12-16 18:54:56 所属栏目:安全 来源:网络整理
导读:美好的一天! 我对 scala很新,所以在开发期间提出了以下问题: 我想描述类Tree [T],其中T是类型参数. 但是T应该受到约束 – 它应该有两种方法: def key():A,其中A是某种类型,派生自方法的实现(!) 和def联合(x:T):T,其中T与类型参数相同. 我想这个约束可
美好的一天!
我对 scala很新,所以在开发期间提出了以下问题:

我想描述类Tree [T],其中T是类型参数.
但是T应该受到约束 – 它应该有两种方法:
def key():A,其中A是某种类型,派生自方法的实现(!)
和def联合(x:T):T,其中T与类型参数相同.
我想这个约束可以用几种方式表达:

>使用方法键定义两个特征,使用方法联合定义其他特征(两个特征是因为这些方法的独立性)
>使用结构子类型
>别的……

那我怎么能以各种方式做到这一点?并存在其他方式吗?

如果为简单类型(如String,Int等)添加这些方法也很容易.

解决方法

您可以为键定义结构类型,但不能为union定义.结构类型可能不是指在其自身之外定义的抽象类型.所以这不起作用:

trait Tree[T <: { def union(x: T): T }]

您可以定义树的元素必须可用的特征,但是:

trait TreeVal[T] {
    type A
    def key: A
    def union(x: T): T
}

这可以用两种方式.首先,类必须实现该接口,这严重限制了哪些类可以用作键.这将是这样的:

trait Tree[T <: TreeVal[T]]

它也可以作为隐式转换提供,如下所示:

class IntVal(v: Int) extends TreeVal[Int] {
    type A = Int
    def key: A = v
    def union(x: Int): Int = x + v
}
implicit def IntIsVal(v: Int): IntVal = new IntVal(v)

class Tree[T <% TreeVal[T]] // must be class,so it can receive parameters

这使用了所谓的视图边界.查看更多信息,但足以说您将能够处理任何已定义隐式转换且范围内的内容,就好像它是TreeVal一样.例如:

class Tree[T <% TreeVal[T]](node: T,left: Option[Tree[T]],right: Option[Tree[T]]) {
    override def toString = "(%s < %s > %s)" format (left.getOrElse("o"),node.key,right.getOrElse("o"))
}

或者,您可以将其与类型类模式一起使用,并进行一些更改:

trait TreeVal[T] {
    type A
    def key(v: T): A
    def union(x: T,y: T): T
}
class Tree[T : TreeVal]  // must be class,so it can receive parameters

类型类模式使用上下文边界.查看更多信息.这种风格通常比现在的风格更受欢迎,因为它在许多方面更加灵活.不过,两者都有效.

在这种情况下,人们会像这样使用它:

implicit object IntVal extends TreeVal[Int] {
    type A = Int
    def key(v: Int) = v
    def union(x: Int,y: Int) = x + y
}

class Tree[T: TreeVal](node: T,right: Option[Tree[T]]) {
    val treeVal = implicitly[TreeVal[T]]
    import treeVal._

    override def toString = "(%s < %s > %s)" format (left.getOrElse("o"),key(node),right.getOrElse("o"))
}

(编辑:李大同)

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

    推荐文章
      热点阅读