如何在Java子类中调用Scala trait的构造函数?

时间:2015-07-03 17:33:40

标签: java scala inheritance interop

假设我有:

trait A{
    println("A")
}

现在我想在我的Java代码中继承这个特性:

class B implements A {}

看起来特征A的构造函数不会被执行。 是否有可能强制特性A的构造函数在类B的范围内执行?

2 个答案:

答案 0 :(得分:3)

这将成为:

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);
  }
}

答案 1 :(得分:3)

获取Java类实现具有构造函数和/或非抽象成员的特征的最合理方法是使用Scala中的类扩展特征,然后在Java中扩展此类:

// AbstractA.scala
abstract class AbstractA extends A 

// B.java
class B extends AbstractA

这样,Scala编译器会处理你必须用Java手动完成的所有事情,正如你在bjfletcher的回答中所看到的那样。