2014-10-30 46 views
0

看看下面的代碼片段:有不同的方法簽名

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代碼。

爲什麼?

回答

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(); 
} 
+0

感謝Marth,順便說一句,在scala repl中,我使用了:類型c1和:類型c2,結果並沒有給出任何跡象表明特徵在這裏涉及。 – 2014-10-30 10:38:48

+0

匿名類不構成(外部可見)類型的一部分。 – lmm 2014-10-30 11:36:07

0

相當於Java中的是

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

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

,你不能直接調用c1.m1(),但你可以使用反射做到這一點:

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

斯卡拉只允許您使用一個簡單的語法做到這一點。

相關問題