关于为什么我们无法实例化类型成员的快速问题?例如,举个例子:
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
只是好奇为什么类型成员无法实例化?任何解决方法?
谢谢!
答案 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没有这种约束的功能。