scala - Scala 中的参数或子类型多态性

标签 scala polymorphism

我想澄清一下我是否有权定义这两种多态性情况:

第一:

class Operations

trait ExpAlg {
  type Opr <: Operations
  def lit(x: Int): Opr
}

trait Eval extends Operations {
  def eval(): Int
}
trait EvalExpAlg extends ExpAlg {
  type Opr = Eval
  def lit(x: Int) = new Eval() {
    def eval() = x
  }
}

它是否使用具有边界和特征的子类型多态性?

第二:

trait ExpAlg[E] {
  def lit(x: Int): E
}
trait Eval {
  def eval(): Int
}
trait EvalExpAlg extends ExpAlg[Eval] {
  def lit(x: Int) = new Eval() {
    def eval() = x
  }
}

它是否使用具有不变类型参数和特征的子类型多态性?或者也许它是参数多态性和子类型多态性的混合?

我通过阅读 this 得到这些结论文章。

最佳答案

首先,抽象类型和类型参数是可以相互替代的。您可以找到大量有关该主题的 Material ,例如 this one .

话虽如此,您的示例之间唯一真正的区别是第一个示例使用有界类型,而第二个示例则没有。然而,在这两种情况下,EvalExpAlg 都扩展了 ExpAlg 并提供了 lit() 的实现,这使其成为子类型多态性的情况。

因此,我想说这两个示例都是使用子类型多态性的情况,而不是参数化的情况(参数化需要所有类型的实现都相同,而不是由每个子类单独提供)。第一个与第二个相比的区别在于 a) 上限的使用和 b) 使用抽象类型而不是类型参数。

关于scala - Scala 中的参数或子类型多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34697305/

相关文章:

scala - 在运行时传递类型信息

scala - 如何使用scala宏打印变量名和值?

c++ - C++中的递归组合

java - Java中接受两种不同类型作为参数的方法

C++调用子类的虚方法而不是基类

c++ - 如何调用列表中对象的函数?

scala - 配置 Scalaxb SBT 插件生成的源代码位置

scala - Scala 中的整数分区

Scala 设置哈希码

java - 为什么我可以在实例不可见的情况下调用子类实例的私有(private)方法?