Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala中扩展Java抽象类_Java_Scala_Abstract Class - Fatal编程技术网

在Scala中扩展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

给定一个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的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
的主构造函数设置为私有,以确保用户始终使用备用构造函数。