我想澄清一下我是否拥有定义这两种多态性案例的权利:
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
}
}
是否使用带有边界和特征的子类型多态性?
{{1}}
它是否使用Subtype多态与Invariant类型参数和Traits?或者它可能是参数和子类型多态之间的混合?
我在阅读this文章后得到了这些结论。
答案 0 :(得分:2)
首先,抽象类型和类型参数是彼此的替代品。您可以找到关于该主题的大量材料,例如this one。
话虽如此,你的例子之间唯一真正的区别在于第一个使用有界类型而第二个没有。但是,在这两种情况下,EvalExpAlg都扩展了ExpAlg并提供了lit()的实现,这使得它成为子类型多态的一种情况。
所以,我想说两个例子都是使用子类型多态的情况,而不是参数(参数会要求所有类型的实现相同,而不是由每个子类单独提供)。第一个与第二个相比的差异在于a)上限的使用和b)抽象类型的使用而不是类型参数。