在Scala中扩展Java抽象类
给定一个Java类,类似在Scala中扩展Java抽象类,java,scala,abstract-class,Java,Scala,Abstract Class,给定一个Java类,类似 公共抽象类A{ 公共A(URI u){ } } 我可以像这样在Scala中扩展它 类B(u:URI)扩展了A(u){} 然而,我想做的是改变B的构造函数,类似于 case类设置() B类(设置:设置)扩展了{ //句柄设置 //调用A的构造函数 } 在Scala中这样做的正确语法是什么?在Java中,在调用A的c'tor之前,您无法真正处理设置。即使看起来不是这样,类定义中的所有初始化实际上都是构造函数代码。这就是为什么Java中没有用于调用super的c'tor
公共抽象类A{
公共A(URI u){
}
}
我可以像这样在Scala中扩展它
类B(u:URI)扩展了A(u){}
然而,我想做的是改变B的构造函数,类似于
case类设置()
B类(设置:设置)扩展了{
//句柄设置
//调用A的构造函数
}
在Scala中这样做的正确语法是什么?在Java中,在调用A的c'tor之前,您无法真正处理设置。即使看起来不是这样,类定义中的所有初始化实际上都是构造函数代码。这就是为什么Java中没有用于调用super的c'tor的语法,所以在调用A的c'tor之前,您无法真正处理设置。即使看起来不是这样,类定义中的所有初始化实际上都是构造函数代码。这就是为什么调用super的c'tor没有语法的原因,块是Scala中的表达式,所以您可以在调用超类构造函数之前运行代码。下面是一个(愚蠢的)例子:
Foo类(a:Int)
类栏(s:String)扩展了Foo({
印地安(s)
s、 托因
})
块是Scala中的表达式,因此可以在调用超类构造函数之前运行代码。下面是一个(愚蠢的)例子:
Foo类(a:Int)
类栏(s:String)扩展了Foo({
印地安(s)
s、 托因
})
您可以通过与使用早期初始值设定项非常类似的方式实现这一点
假设存在如上所述的抽象类A
,则可以执行以下操作:
案例类设置(u:URI)
B类(s:设置)扩展{
val uri=s.u
}带有一个(uri)
然后打电话:
val b=new b(设置(新URI(“aaa”))
println(b.uri)
您可以通过与使用早期初始值设定项非常类似的方式实现这一点
假设存在如上所述的抽象类A
,则可以执行以下操作:
案例类设置(u:URI)
B类(s:设置)扩展{
val uri=s.u
}带有一个(uri)
然后打电话:
val b=new b(设置(新URI(“aaa”))
println(b.uri)
您看到了吗:@jmizv谢谢,我确实看到了,但我认为这没有帮助,因为我无法更改Java类。您可以在B
中设置重载构造函数,或者将该逻辑放在伴生对象的apply
中。另外,您可以将B
的主构造函数设置为私有,以确保用户始终使用替代方法。您看到了吗:@jmizv谢谢,我确实看到了,但我认为这没有帮助,因为我无法更改Java类。您可以在B
中设置重载构造函数,或者将该逻辑放在伴生对象的apply
中。此外,您还可以将B
的主构造函数设置为私有,以确保用户始终使用备用构造函数。