Scala:抽象类的实例化?

8

如何实例化一个抽象类?

  abstract class A {
    val a: Int
  }

  val a = new A {val a = 3}

或者说是一些具体的类被隐式创建了吗?那么new A后面的大括号代表什么意思呢?

4个回答

22

通过这样做,您隐式地扩展了A。您所做的是一种语法糖,等效于以下代码:

class A' extends A {
    val a = 3
}
val a = new A'

这些括号只是让您在运行时扩展一个类,创建一个新的匿名类,该类实例化值a,因此不再是抽象的。


7

如果你了解Java,这就类似于:

new SomeAbstractClass() {
    // possible necessary implementation
}

由于Scala的统一访问,看起来您没有实现任何抽象函数,但是仅通过给a赋值,您实际上已经“具体化”了该类。
换句话说,您正在创建一个A的具体子类的实例,而没有给子类命名(因此术语“匿名”类)。

4

您正在实例化一个匿名类,它继承自A并重载了其抽象成员a。请参考Scala之旅:抽象类型中有关匿名类实例化的部分。


3

Scala允许你创建匿名类,不仅仅是匿名函数。

你所做的与以下内容相似:

class Anon extends A {
  val a = 3
} 

但是没有使用 Anon 名称


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接