查看以下代码段:
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代码。
为什么?
答案 0 :(得分:5)
您正在使用特征扩展C
,因此c1
和c2
是匿名类:
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只允许您使用更简单的语法来完成它。