好的,我知道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());
}
了解它是如何通过强制转换访问就地定义的方法。是否有意义?无法理解这一部分,因为当我自己尝试这样做时,它引发了一个例外。