如何在 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 的回答中看到的那样。