特征和接口二进制兼容吗?

use*_*882 1 java scala interface traits

我刚刚种的事实,惊讶的Scala二进制兼容不同发行版本.现在,因为Java 8我们的默认方法实现与traits提供的几乎相同,是否可以安全地在Java代码中使用traits?我试图自己使用它:

trait TestTrait {
  def method(v : Int)
  def concrete(v : Int) = println(v)
}

public class Test implements TestTrait{ // Compile-error. Implement concrete(Int)
    @Override
    public void method(int v) {
        System.out.println(v);
    }
}
Run Code Online (Sandbox Code Playgroud)

但它拒绝编译.编译器抱怨没有变形concrete(Int).虽然我在中指定了实现TestTrait.

Ale*_*nov 7

当Scala 2.11编译器编译特征时,它不会生成具有默认方法的接口,因为生成的代码必须与Java 6一起使用.在Scala 2.12(需要Java 8)中它将会,因此如果您编译Scala代码使用2.12编译器,我希望您能够以这种方式从Java中使用它(至少对于像这样的简单情况).

请注意,像这样的更改正是使不同的Scala版本二进制文件不兼容的原因:如果您尝试使用Scala 2.12中使用Scala 2.11编译的特征,它将尝试调用接口的默认方法,而不是那里.