在scala中扩展java抽象类

avwztpqn  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(311)

给定一个java类,比如

public abstract class A {
    public A(URI u) {
    }
}

我可以像这样在scala中扩展它

class B(u: URI) extends A(u) { }

但是,我想做的是改变b的构造函数,比如

case class Settings()

class B(settings: Settings) extends A {
  // Handle settings
  // Call A's constructor
}

在scala中这样做的正确语法是什么?

okxuctiv

okxuctiv1#

块是scala中的表达式,因此可以在调用超类构造函数之前运行代码。下面是一个(愚蠢的)例子:

class Foo(a: Int)
class Bar(s: String) extends Foo({
  println(s)
  s.toInt
})
fkvaft9z

fkvaft9z2#

您可以用一种非常类似于使用早期初始值设定项在类内创建对象的方式来实现这一点。
假设有一个抽象类 A 如上所述,您可以:

case class Settings(u: URI)

class B(s: Settings) extends {
  val uri = s.u
} with A(uri)

然后打电话:

val b = new B(Settings(new URI("aaa")))
println(b.uri)
utugiqy6

utugiqy63#

在java中,“调用超类构造函数必须是子类构造函数的第一行”,因此,在调用a的c'tor之前,不能真正处理设置。即使看起来不是这样,类定义中的所有初始化实际上都是构造函数代码。这就是为什么没有语法来调用super的c'tor

相关问题