Scala Traits 的行为如何?

How Scala Traits behave?

为了更好地理解特性,我创建了这个 Scala 小示例。

trait Writer {
  def write(value: Int): Unit = {
    print("Writer")
  }
}

trait Hdd extends Writer {
  override def write(value: Int): Unit = {
    print("Hdd")
  }
}

trait File extends Writer {
  override def write(value: Int): Unit = {
    print("File")
  }
}

class TestClass extends App {
  (1)   val myWriter = new Writer with Hdd   // This line looks fine
  (2)   val myNewWriter = new Writer         // This line fail
}

据我所知,无法实例化 Trait,因此第 (2) 行失败了。

但由于某些我无法理解的原因,第 (1) 行看起来不错。

这怎么可能?

尝试:

val myWriter = new Writer {}

我想它需要一个实现,即使那个实现是空的

是的,你是对的,一个特征不能在Scala.A中实例化。特征不能实例化,只能混入。你需要一个class来实例化,当你使用"new writer with Hdd", 它创建了一个匿名 class 因此你的实例化看起来很好并且没有给出任何 error.And 你在第二行得到错误因为它只是一个特征因此不能被实例化。