Scala中的可交换特征
发布时间:2020-12-16 18:40:25 所属栏目:安全 来源:网络整理
导读:我想定义一个具有两个值x,y和交换方法的Swappable特征,这样在从Swappable继承的对象上调用swap会返回x,y切换的同一类型的另一个对象.到目前为止,我最好的是: trait Swappable[T] { val x: T val y: T def swap: Swappable[T] = { val (a,b) = (x,y) new Swa
我想定义一个具有两个值x,y和交换方法的Swappable特征,这样在从Swappable继承的对象上调用swap会返回x,y切换的同一类型的另一个对象.到目前为止,我最好的是:
trait Swappable[T] { val x: T val y: T def swap: Swappable[T] = { val (a,b) = (x,y) new Swappable[T] { val x=b; val y=a } } } 但这不是我想要的,因为swap的返回类型是一些匿名类,而不是我开始的原始类,所以我得到如下错误: def direct[S<:Swappable[Int]](s: S): S = if (s.x > s.y) s else s.swap <console>:32: error: type mismatch; found : Swappable[Int] required: S def direct[S<:Swappable[Int]](s: S): S = if (s.x > s.y) s else s.swap ^ 有可能做我想做的事吗?交换的正确类型签名是什么? 解决方法
我不知道该怎么做,但我想也许有助于更好地了解你想要发生什么.考虑像一个类
case class Foo(x: Int,y: Int) extends Swappable[Int] { val z = x } 现在,如果你有f = Foo(1,2),f.swap应该给你一个Foo,其中x!= z?如果是这样,Scala内部就没有办法像这样创建一个Foo.如果没有,“交换x和y”真正意味着什么? 也许你真正想要的是这样的: trait Swappable[A,T] { this: A => val x: T val y: T def cons(x: T,y: T): A def swap = cons(y,x) } case class Foo(x: Int,y: Int) extends Swappable[Foo,Int] { val z = x def cons(x: Int,y: Int) = copy(x=x,y=y) } 但我不确定. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- WebService学习笔记-读取webxml.com.cn的天气服务
- WCF Introdution Part1:Services ABC
- Spark/Scala实现推荐系统中的相似度算法(欧几里
- angular – ERROR TypeError:无法读取未定义的属
- angular – 从选项卡转到根页面
- twitter-bootstrap – Bootstrap 3 Gutter Size
- bootstrap 3 学习乱记
- cisco-asa – 配置Freeradius以针对多个LDAP组检
- 专家观察 | 赵安全:“Docker容器在传统行业的落
- AngularJS路由实例(uiRoute、ngRoute)
热点阅读