![](/img/trans.png)
[英]Ignore default constructor and use constructor with parameters in Java
[英]Instantiate a Scala class from Java, and use the default parameters of the constructor
我有一个Scala类:
class Foo(val x:String = "default X", val y:String = "default Y" )
我想从Java调用它,但使用默认参数
传递null
不起作用(它按预期分配null
)
new Foo(null,null); //both are instantiated as null
这个技巧确实对我有用,但它很丑陋,我想知道是否有更好的方法:
斯卡拉
class Foo(val x:String = "default X", val y:String = "default Y" ) {
def this(x:Object) = this()
}
爪哇
new Foo(null); //no matter what I pass it should work
但是我想摆脱构造函数重载技巧,并使用 0 param 构造函数
那可能吗?
看来,没有这样的方法: https : //issues.scala-lang.org/browse/SI-4278
问题:应该为具有全可选参数的类生成默认的无参数构造函数
...Lukas Rytz :关于语言统一性,我们决定不修复这个问题——因为这是与框架的互操作性问题,我们认为不应该在语言级别修复。
解决方法:重复一个默认值,或抽象一个,或将一个默认值放入零参数构造函数
然后 Lukas 提出了与您发现的相同的解决方案:
class C(a: A = aDefault, b: B = C.bDefault) {
def this() { this(b = C.bDefault) }
}
object C { def bDefault = ... }
// OR
class C(a: A = aDefault, b: B) {
def this() { this(b = bDefault) }
}
有一个解决方案,请查看文章中的“默认参数”部分: https : //lampwww.epfl.ch/~michelou/scala/using-scala-from-java.html
可以通过使用 .$default$[number] 格式从 java 传递适当的位置参数来调用构造函数和方法。
这里的范围如下:
例子:
import za.co.absa.spline.core.SparkLineageInitializer;
SparkLineageInitializer.SparkSessionWrapper lineage = SparkLineageInitializer.SparkSessionWrapper(spark);
lineage.enableLineageTracking(lineage.enableLineageTracking$default$1());
对于此示例,maven 依赖项是: groupId: za.co.absa.spline artifactId: spline-core version: 0.3.1
更一般地说,如果您有一个带有默认参数的 Scala 类,并且您想在 Java 中实例化覆盖 0、1 或多个默认值而不必指定所有,请考虑扩展 Scala API 以在伴随对象中包含一个 Builder。
case class Foo(
a: String = "a",
b: String = "b",
c: String = "c"
)
object Foo {
class Builder {
var a: String = "a"
var b: String = "b"
var c: String = "c"
def withA(x: String) = { a = x; this }
def withB(x: String) = { b = x; this }
def withC(x: String) = { c = x; this }
def build = Foo(a, b, c)
}
}
public class App {
public static void main(String[] args) {
Foo f = new Foo.Builder()
.withA("override a")
.build();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.