我想澄清一下我是否有权定义这两种多态性情况:
第一:
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/