同类的对象具有不同的方法签名

时间:2014-10-30 10:22:23

标签: scala

查看以下代码段:

class C
val c1 = new C { def m1 = "c1 has m1" }
val c2 = new C { def m2 = "c2 has m2" }

c1.m1
c2.m2
//c2.m1
//c1.m2

在REPL中运行它,然后你知道我的意思。

我有限的java知识告诉我,在java中,同一类的对象将具有相同的方法signagure,并且就OO而言,java和scala之间没有太大的区别。 (纠正我,如果我错了),所以我很惊讶地看到该片段是声音scala代码。

为什么?

2 个答案:

答案 0 :(得分:5)

您正在使用特征扩展C,因此c1c2是匿名类:

scala> c1.getClass
res0: java.lang.Class[_ <: C] = class $anon$1

scala> c2.getClass
res1: java.lang.Class[_ <: C] = class $anon$2

查看java代码,你会看到(O是一个周围的对象,可以让它编译):

public final class O$$anon$1 extends O$C {
  public java.lang.String m1();
  public O$$anon$1();
}

public final class O$$anon$2 extends O$C {
  public java.lang.String m2();
  public O$$anon$2();
}

答案 1 :(得分:0)

Java等价物是

C c1 = new C { 
    public String m1() { ... }
}

C c2 = new C { 
    public String m2() { ... }
}

现在,您无法直接呼叫c1.m1(),但您可以使用反射来执行此操作:

c1.getClass().getMethod("m1").invoke(c1)

Scala只允许您使用更简单的语法来完成它。