如何在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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |