关于Scala中类型类的问题
发布时间:2020-12-16 18:33:43 所属栏目:安全 来源:网络整理
导读:我们有水果,橙子和苹果等课程. abstract class Fruitclass Orange extends Fruitclass Apple extends Fruit 现在我想为Orange和Apple两种类型添加写入功能.使用类型类模式我可以执行以下操作: trait Writer[T] {def write(t:T)}implicit object AppleWriter
我们有水果,橙子和苹果等课程.
abstract class Fruit class Orange extends Fruit class Apple extends Fruit 现在我想为Orange和Apple两种类型添加写入功能.使用类型类模式我可以执行以下操作: trait Writer[T] {def write(t:T)} implicit object AppleWriter extends Writer[Apple] { def write(a:Apple) {println("I am an apple!")} } implicit object OrangeWriter extends Writer[Orange] { def write(o:Orange) {println("I am an orange!")} } def write[T](t:T)(implicit w:Writer[T]){w.write(t)} 所以,好,但如果我想定义writeFruits怎么办? def writeFruits(fruits:List[Fruit]) {for (fruit <- fruits) write(fruit)} 我想writeFruits可以为每个水果打电话写[Apple]或写[Orange].我看到它不起作用(我知道为什么)但也许我可以实现writeFruits. 我能以某种方式实现writeFruits吗? 解决方法
你只需要选择那些存在Writer的Fruit.不幸的是,一旦你投射到Fruit,你就失去了自动找出哪个是哪个的能力.如果你必须以这种方式设置问题 – 而不是组装一个可写水果列表或某些 – 那么一个合理的选择是使用FruitWriter再次拆分类型:
def writeOne[T](t:T)(implicit w:Writer[T]){w.write(t)} // New name to avoid shadowing implicit object FruitWriter extends Writer[Fruit] { def write(f: Fruit) { f match { case o: Orange => writeOne(o) case a: Apple => writeOne(a) }} } scala> val fruits = List(new Apple,new Orange) fruits: List[Fruit] = List(Apple@1148ab5c,Orange@39ea2de1) scala> for (fruit <- fruits) writeOne(fruit) I am an apple! I am an orange! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- shell脚本应用《十》查看多个系统CPU,指定的进程CPU,主备机
- Angular 4:JSONP注入脚本没有调用回调
- bootstrap导航、选项卡实现代码
- angularjs – 如何从angular $location获取主机基础
- angularjs – 如何在Angular中添加可重用的模态对话框?
- 单元测试 – angular2单元测试:如何使用triggerEventHandl
- copy命令及库文件至/mnt/sysroot/目录shell脚本
- docker – 我可以在不下载图像的情况下获得图像摘要吗?
- playbook
- 如何使用不会污染全局范围的TypeScript类定义AngularJS服务