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

如何在Scala中创建泛型类型的对象/单例?

发布时间:2020-12-16 09:07:51 所属栏目:安全 来源:网络整理
导读:在下面显示的代码中,如何将EmptyTree转换为对象(Singleton)? trait Tree[T] { def contains(num: T): Boolean def inc( num: T ): Tree[T] }class EmptyTree[T % Ordered[T] ] extends Tree[T] { def contains(num:T):Boolean = false def inc(num:T):Tree[
在下面显示的代码中,如何将EmptyTree转换为对象(Singleton)?

trait Tree[T] {
    def contains(num: T): Boolean
    def inc( num: T ): Tree[T]
  }


class EmptyTree[T <% Ordered[T] ] extends Tree[T] {
    def contains(num:T):Boolean = false
    def inc(num:T):Tree[T] = {
        new DataTree(num,new EmptyTree,new EmptyTree)
    }
    override def toString = "."
}

class DataTree[T <% Ordered[T] ](val x:T,val left:Tree[T],val right:Tree[T]) extends Tree[T] {

    def contains(num:T):Boolean = {
        if( num < x ) left.contains(x)
        else if ( num > x ) right.contains(x)
        else true
    }
    def inc(num:T):Tree[T] = {
        if(num < x ) new DataTree(x,left.inc(num),right)
        else if ( num > x ) new DataTree(x,left,right.inc(num))
        else this
    }
    override def toString = "{" + left + x + right + "}"
}


val t = new DataTree(20,new EmptyTree[Int],new EmptyTree[Int])
                                                //> t  : greeting.Test.DataTree[Int] = {.20.}
val p = t.inc(10)                               //> p  : greeting.Test.Tree[Int] = {{.10.}20.}
val a = p.inc(30)                               //> a  : greeting.Test.Tree[Int] = {{.10.}20{.30.}}
val s = a.inc(5)                                //> s  : greeting.Test.Tree[Int] = {{{.5.}10.}20{.30.}}
val m = s.inc(11)                               //> m  : greeting.Test.Tree[Int] = {{{.5.}10{.11.}}20{.30.}}

解决方法

让我告诉阿列克谢的回答.以下是完整的实现,包括一些代码样式改进:

首先用协方差的知识来定义你的特征:

trait Tree[+T] {
    def contains[U >: T : Ordering](num: U): Boolean

    def inc[U >: T : Ordering](num: U): Tree[U]
  }

接下来定义您的所有树类型对象

case object EmptyTree extends Tree[Nothing] {
    def contains[U >: Nothing : Ordering](num: U): Boolean = false
    def inc[U >: Nothing : Ordering](num: U): Tree[U] =
      DataTree(num,EmptyTree,EmptyTree)
    override def toString = "."
  }

现在改变你的一般案例实现:

case class DataTree[T: Ordering](x: T,left: Tree[T],right: Tree[T]) extends Tree[T] {
    import Ordering.Implicits._
    def contains[U >: T : Ordering](num: U): Boolean = 
      if (num < x) left.contains(x)
      else if (num > x) right.contains(x)
      else true

    def inc[U >: T : Ordering](num: U): Tree[U] = 
      if (num < x) DataTree(x,right)
      else if (num > x) DataTree(x,right.inc(num))
      else this

    override def toString = "{" + left + x + right + "}"
  }

你可能有点沮丧,因为我更换了你订购的订单,但你应该知道view bounds are deprecated

(编辑:李大同)

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

    推荐文章
      热点阅读