【问题标题】:Abstract type vs. type parameter - where is the difference? [duplicate]抽象类型与类型参数 - 区别在哪里? [复制]
【发布时间】:2012-06-29 18:27:50
【问题描述】:

可能重复:
Scala: Abstract Types vs Generics

“Scala 编程”的第 20.6 章“抽象类型”解释了抽象类型的使用,并附有一个以以下结果代码结尾的示例:

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

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

有了这些定义,Cow 的对象就不能吃鱼了:

class Fish extends Food
val bessy: Animal = new Cow
bessy eat (new Fish) // Error, type mismatch

在阅读了这个关于使用抽象类型的好例子之后,我想知道,为什么我们不只使用类型参数呢?

class Food
abstract class Animal[T <: Food] { 
  def eat(food: T)
}

class Grass extends Food
class Cow extends Animal[Grass] {
  override def eat(food: Grass){}
}

class Fish extends Food
val bessy: Animal[Grass] = new Cow
bessy eat (new Fish) // Also ends in a type mismatch error !

这里使用类型参数而不是抽象类型有什么区别?

【问题讨论】:

    标签: scala type-parameter abstract-type


    【解决方案1】:

    Martin Odersky 在this 采访中回答了这个问题。

    一直有两个抽象概念:参数化和抽象成员。在 Java 中,你也有两者,但是 这取决于你抽象的内容。在Java中你有抽象 方法,但不能将方法作为参数传递。你没有 抽象字段,但您可以将值作为参数传递。和 同样,您没有抽象类型成员,但您可以指定一个 类型作为参数。所以在Java中你也有这三个,但是 你可以使用什么抽象原则是有区别的 什么样的东西。你可以争辩说这种区别是 相当随意。

    我们在 Scala 中所做的就是尝试更加完整和正交。我们决定对所有三个都采用相同的构造原则 各种成员。所以你可以有抽象字段和值 参数。您可以将方法(或“函数”)作为参数传递,或者 你可以抽象它们。您可以将类型指定为参数,或者 你可以抽象它们。我们从概念上得到的是,我们 可以根据另一个建模一个。至少在原则上,我们可以 将各种参数化表达为面向对象的一种形式 抽象。所以在某种意义上你可以说 Scala 是一个更正交的 和完整的语言。

    也就是说,两者之间存在一些细微差别,但我想不起来。

    您可能还想看看this 线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多