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

时间:2018-12-12 17:50:43

标签: 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。那为什么不能在普通代码中使用它呢? 我不太了解。也许我是个白痴,但如果有人能很好地向我解释,我将非常感激。

2 个答案:

答案 0 :(得分:5)

它是trait,因此您需要正确地“实例化”它:

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

请注意,从技术上讲trait不能实例化。上面的表达式是扩展特性的匿名类的实例。

答案 1 :(得分:1)

from sympy import * ctx = { "f": Function("f"), "x": var("x",integer=True) } initial_conditions = { 0: 1, 1: 1, 2: 1, 3: 1 } f = sympify("-2*f(x-1)+11*f(x-2)+12*f(x-3)-36*f(x-4) +41**(x-4)+3 -f(x)", ctx) # calculate f(10) here without creating a closed from # The code below will not work rsolve returns None solve_for = sympify("f(x)", ctx) solved = rsolve(f, solve_for, initial_conditions) 是类型,而不是值。你不能写

Singleton.FirstTrait

写不完

val singleton = Singleton.FirstTrait

等特性和类可以具有伴随对象(同名的val singleton = Int val singleton = String ),但是object显然没有同伴对象。

可以将其用作一种类型,例如

FirstTrait