实例化Scala类型成员会导致错误

时间:2016-11-16 08:50:39

标签: scala type-members

关于为什么我们无法实例化类型成员的快速问题?例如,举个例子:

abstract class SimpleApplicationLoader {
  type MyComponents <: BuiltInComponentsFromContext

  def load(context: Context) = {
    new MyComponents(context).application
  }
}

class SiteServiceApplicationLoader extends SimpleApplicationLoader {
  type MyComponents = SiteApplicationComponents
}

class SiteApplicationComponents(val context: Context) extends BuiltInComponentsFromContext(context) {
      ....
}

SimpleApplicationLoader 定义了一个类型参数 MyComponents (上限为 BuiltinComponentsFromContext )。在 load 方法中,实例化类型参数 MyComponents SiteServiceApplicationLoader 会将MyComponents类型覆盖为_SiteApplicationComponents)。

无论如何,编译器会出现以下错误:

Error:(13, 9) class type required but SimpleApplicationLoader.this.MyComponents found
    new MyComponents(context).application

只是好奇为什么类型成员无法实例化?任何解决方法?

谢谢!

2 个答案:

答案 0 :(得分:3)

运营商new仅适用于classes (or "like classes")。类型不是类,因此new不可用。

要实例化任意类型,可以使用函数

def newMyComponents(context: Context): MyComponents

更新(感谢@ daniel-werner)

所以抽象类看起来像

abstract class SimpleApplicationLoader {
  type MyComponents <: BuiltInComponentsFromContext

  def newMyComponents(context: Context): MyComponents

  def load(context: Context) = {
    newMyComponents(context).application    
  }
}

抽象方法可能在定义class的{​​{1}}中实现:

type

答案 1 :(得分:3)

您无法实例化类型。您只能实例化一个类。

您的代码中没有任何内容限制MyComponents成为一个类。它也可以是特征,单例​​类型,复合类型,甚至是抽象类,也无法实例化。

其他语言可以将类型约束为类或具有构造函数。例如,在C♯中,您可以使用零参数构造函数将类型约束为类或结构。但Scala没有这种约束的功能。