scala - 当混合具有冲突的抽象覆盖的多个特征时,我如何预测将选择哪个实现?

标签 scala mixins traits subtyping

考虑这个例子:

abstract class Writer {
  def write(message: String): Unit
}

trait UpperCaseFilter extends Writer {
  abstract override def write(message: String) =
    super.write(message.toUpperCase)
}

trait LowerCaseFilter extends Writer {
  abstract override def write(message: String) =
    super.write(message.toLowerCase)
}

class StringWriter extends Writer {
  val sb = new StringBuilder

  override def write(message: String) =
    sb.append(message)

  override def toString = sb.toString
}

object Main extends App {
  val writer = new StringWriter with UpperCaseFilter with LowerCaseFilter
  writer.write("Hello, world!")
  println(writer)
}

我对输出“HELLO, WORLD!”感到惊讶为什么输出不是“hello, world!”还是编译错误?

最佳答案

决定它的逻辑叫做线性化。您可以在此处找到有关它的更多信息:

http://www.artima.com/pins1ed/traits.html#12.6

在您的情况下,整个类层次结构将像这样线性化:

LowerCaseFilter > UpperCaseFilter > Writer > StringWriter > AnyRef > 任何

因此,如您所见,UpperCaseFilter 是进入 StringWriter 的最后一个转换。

关于scala - 当混合具有冲突的抽象覆盖的多个特征时,我如何预测将选择哪个实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24561914/

相关文章:

Dart:不带扩展的 mixin 组合

rust - 如何在 Rust 中正确实现 Error::cause?

php - 不确定 Laravel 在接口(interface)实现方面做了什么

python - 尝试覆盖 django rest 框架中的更新方法以在更新后返回整个查询集

c++ - 如何确定非多态类型的混合模板的类型兼容性

scala - 为 Scala 枚举导出 Cats 顺序

java - 在 Java 中,如何将 scala.list 转换为 java.list

design-patterns - 如何拥有特质的私有(private)部分?

java - 提升 json :Custom serializer for java 8 LocalDateTime throwing mapping exception

scala - 为什么 Akka 适合缩放 "up"和 "out"?