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

关于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!

(编辑:李大同)

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

    推荐文章
      热点阅读