首页 > 解决方案 > Scala - 为什么不能使用对象的特征

问题描述

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

object Singleton {

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

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

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

现在,Main实际上,我想做这样的事情:

object Main extends App {    
  val singleton = Singleton.FirstTrait//cannot do this
}

但我不能这样做(编译错误)。为什么?为什么我无法访问这个本地特征?如果我将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)
  }
}

Main运行良好并且程序可以编译。但是我从 中调用另一个单例对象Singleton,而不是特征。我知道trait不能实例化,但我认为这不是解决方案,因为我还有一个简单的ScalaTest测试名称,看起来像

"Singleton" should "test it" in Singleton.FirstTrait{...}

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

标签: scala

解决方案


这是一个trait所以你需要正确地“实例化”它:

val singleton = new Singleton.FirstTrait {}
// singleton: Singleton.FirstTrait = $anon$1@5e97da56

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


推荐阅读