scala如何在Java中实现?

时间:2014-05-20 10:51:36

标签: java scala traits

好的,我知道javap工具,已经看过反编译的java类文件。然而,仍然存在一些关于如何在java中实现scala特性的问题,因为我更像是.net开发人员。

trait A{
  def foo = "A"
}

trait B extends A{
  override def foo = "B"
  def bfoo = "bfoo"
}

trait C extends A{
  override def foo = "C"
  def cfoo = "cfoo"
}

class D extends A

val d = new D with B with C

有趣的是,上面的d实例在java中实现为

D d = new D()
{
  public void bfoo()
  {
    B.class.bfoo(this);
  }

  public void cfoo()
  {
    C.class.cfoo(this);
  }

  public void foo()
  {
    C.class.foo(this);
  }
};

那是什么构造,

... new D() { //definition of methods}?

我的意思是,有点像在实例初始化程序中定义新方法吗?我尝试以同样的方式为自己编写,但是我没有找到一种方法来访问以这种方式定义的方法。我的意思是在实例初始化器中?

更新

好的,这是完整的示例,它反编译为

object MainClass{
  def main(args:Array[String]){
    val d = new D with B with C
    println(d.bfoo)
    println(d.cfoo)
    println(d.foo)
  }
}

trait A{
  def foo = "A"
}

trait B extends A{
  override def foo = "B"
  def bfoo = "bfoo"
}

trait C extends A {
  override def foo = "C"
  def cfoo = "cfoo"
}

class D extends A

反编译主要方法:

public void main(String[] args) {
    D d = new D() {
      public String bfoo() {
        return B.class.bfoo(this);
      }

      public String cfoo() {
        return C.class.cfoo(this);
      }

      public String foo() {
        return C.class.foo(this);
      }
    };
    Predef..MODULE$.println(((B)d).bfoo());
    Predef..MODULE$.println(((C)d).cfoo());
    Predef..MODULE$.println(((C)d).foo());
}

了解它是如何通过强制转换访问就地定义的方法。是否有意义?无法理解这一部分,因为当我自己尝试这样做时,它引发了一个例外。

0 个答案:

没有答案