scala - scala 中的抽象类型

标签 scala abstract path-dependent-type

我只是在 Scala 中经历抽象类型我有一个错误

我正在尝试的示例:

scala> class Food
abstract class Animal {
type SuitableFood <: Food
def eat(food: SuitableFood)
}
defined class Food
defined class Animal

scala> class Grass extends Food
class Cow extends Animal {
type SuitableFood = Grass
override def eat(food: Grass) {}
}
defined class Grass
defined class Cow

scala> class Fish extends Food
defined class Fish

scala> val bessy: Animal = new Cow
bessy: Animal = Cow@5c404da8

scala> bessy.eat(new bessy.SuitableFood)
<console>:13: error: class type required but bessy.SuitableFood found
              bessy.eat(new bessy.SuitableFood)
                                  ^

scala> bessy.eat(bessy.SuitableFood)
<console>:13: error: value SuitableFood is not a member of Animal
              bessy.eat(bessy.SuitableFood)

scala> bessy.eat(new Grass)
<console>:13: error: type mismatch;
 found   : Grass
 required: bessy.SuitableFood
              bessy.eat(new Grass)

这些错误是什么?

为什么我不能通过new Grasseat方法作为参数,当我创建一个对象时
scala> val c=new Cow
c: Cow = Cow@645dd660


scala> c.eat(new Grass)

你能给我一些关于这个的想法吗?

最佳答案

当您分配 bessy ,你顶了Cow实例到 Anmial :

val bessy: Animal = new Cow

所以从静态的角度来看,bessyAnimal因此 bessy.SuitableFood抽象的。现在到错误:
  • 您不能使用 new 创建抽象类型的对象。 .
  • bessy.SuitableFood尝试访问值成员 SuitableFood (即 def/val)
  • bessy是“仅”一个 Animal ,你不知道(静态)它是否可以吃Grass .

  • 你能做的就是在Animal中添加一个方法允许你创造食物:
    abstract class Animal {
      type SuitableFood <: Food
      def eat(food: SuitableFood)
      def makeFood(): SuitableFood
    }
    

    并实现:
    class Cow extends Animal {
      type SuitableFood = Grass
      override def eat(food: Grass) {}
      override def makeFood() = new Grass()
    }
    

    现在你可以打电话(在任何 Animal 上):
    bessy.eat(bessy.makeFood())
    

    关于scala - scala 中的抽象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20070998/

    相关文章:

    scala - 返回依赖于路径的类型

    java - Spark 列出所有缓存的 RDD 名称并取消持久化

    scala - .g8目录是否必要?

    scala - hibernate session 到列表的转换

    scala - 为什么scala的隐式查找会忽略嵌套类的伴随对象

    scala - Scala 可以注意到路径相关类型之间的身份吗?

    Scala REPL tab-complete 在骗我?

    java - 如何避免静态方法的冗余代码

    Java:静态抽象(再次) - 如何解决的最佳实践

    c# - 获取通用抽象类的所有继承类