Scala - 为什么不能使用来自对象的特征

all*_*cer 0 scala

我用singleton对象创建了一个包含本地特征的简单应用程序:

object Singleton {

  trait FirstTrait {
    val func1 = (i: Int) => i * 2
  }

  trait SecondTrait {
    val func2 = (s: String) => s
  }

  trait ThirdTrait {
    val func3 = () => println("Func 3")
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,在Main对象中,我想做这样的事情:

object Main extends App {    
  val singleton = Singleton.FirstTrait//cannot do this
}
Run Code Online (Sandbox Code Playgroud)

但我不能这样做(编译错误).为什么?为什么我无法访问这个本地特征?如果我将Singleton对象更改为:

object Singleton {

  trait FirstTrait {
    val func1 = (i: Int) => i * 2
  }

  trait SecondTrait {
    val func2 = (s: String) => s
  }

  trait ThirdTrait {
    val func3 = () => println("Func 3")
  }

  object FirstObject extends FirstTrait {
    println(func1)
  }
}
Run Code Online (Sandbox Code Playgroud)

Main运作良好,程序编译.但是我从另一个单身对象中调用了另一个单例对象Singleton.我明白trait不能实例化,但我认为它不是一个解决方案,因为我还有一个简单的ScalaTest测试名称,看起来像

"Singleton" should "test it" in Singleton.FirstTrait{...}
Run Code Online (Sandbox Code Playgroud)

在这里我可以访问FirstTrait.那么为什么我不能在普通代码中使用它呢?我不能理解它.也许我是个白痴,但如果有人能够很好地向我解释,我会很高兴.

Leo*_*o C 5

这是一个trait你需要正确"实例化"它:

val singleton = new Singleton.FirstTrait {}
// singleton: Singleton.FirstTrait = $anon$1@5e97da56
Run Code Online (Sandbox Code Playgroud)

请注意,技术上trait无法实例化.上面的表达式是扩展特征的匿名类的实例化.

  • 不完全是,这不是实例化特征,而是一个扩展特征的匿名类. (2认同)