如何在 Java 子类中调用 Scala trait 的构造函数?
How to call constructor of Scala trait in Java subclass?
假设我有:
trait A{
println("A")
}
现在我想在我的 Java 代码中继承这个特征:
class B implements A {}
看起来 trait A
的构造函数不会被执行。
是否可以强制在 class B
的范围内执行特征 A
的构造函数?
那会变成这样:
public interface A {
}
public abstract class A$class {
public static void $init$(A $this) {
Predef..MODULE$.println((Object)"A");
}
}
使用反编译器。 Java 来说,就是:
public class AImpl implements A {}
public class User {
public User() {
A a = new AImpl();
A$class.$init$(a);
}
}
获得 Java class 实现具有构造函数 and/or 非抽象成员的特征的最合理方法是使用 class 扩展特征在 Scala 中,然后在 Java 中扩展此 class:
// AbstractA.scala
abstract class AbstractA extends A
// B.java
class B extends AbstractA
通过这种方式,Scala 编译器会处理您必须在 Java 中手动完成的所有工作,否则,正如您在 bjfletcher 的回答中看到的那样。
假设我有:
trait A{
println("A")
}
现在我想在我的 Java 代码中继承这个特征:
class B implements A {}
看起来 trait A
的构造函数不会被执行。
是否可以强制在 class B
的范围内执行特征 A
的构造函数?
那会变成这样:
public interface A {
}
public abstract class A$class {
public static void $init$(A $this) {
Predef..MODULE$.println((Object)"A");
}
}
使用反编译器。 Java 来说,就是:
public class AImpl implements A {}
public class User {
public User() {
A a = new AImpl();
A$class.$init$(a);
}
}
获得 Java class 实现具有构造函数 and/or 非抽象成员的特征的最合理方法是使用 class 扩展特征在 Scala 中,然后在 Java 中扩展此 class:
// AbstractA.scala
abstract class AbstractA extends A
// B.java
class B extends AbstractA
通过这种方式,Scala 编译器会处理您必须在 Java 中手动完成的所有工作,否则,正如您在 bjfletcher 的回答中看到的那样。