【发布时间】:2011-12-16 19:55:03
【问题描述】:
如果函数接受结构类型,则可以定义为:
def doTheThings(duck: { def walk; def quack }) { duck.quack }
或
type DuckType = { def walk; def quack }
def doTheThings(duck: DuckType) { duck.quack }
然后,您可以通过以下方式使用该功能:
class Dog {
def walk { println("Dog walk") }
def quack { println("Dog quacks") }
}
def main(args: Array[String]) {
doTheThings(new Dog);
}
如果你对我的例子中由 scalac 生成的类进行反编译(Java),你可以看到doTheThings 的参数是Object 类型,并且实现使用反射来调用参数上的方法(即duck.quack )
我的问题是为什么要反射?难道不能只使用匿名和invokevirtual而不是反射吗?
这是翻译(实现)结构类型调用的方法对于我的示例(Java 语法,但重点是字节码):
class DuckyDogTest {
interface DuckType {
void walk();
void quack();
}
static void doTheThing(DuckType d) {
d.quack();
}
static class Dog {
public void walk() { System.out.println("Dog walk"); }
public void quack() { System.out.println("Dog quack"); }
}
public static void main(String[] args) {
final Dog d = new Dog();
doTheThing(new DuckType() {
public final void walk() { d.walk(); }
public final void quack() { d.quack();}
});
}
}
【问题讨论】: