如果函数接受结构类型,则可以定义为:
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
)
我的问题是为什么要反思?难道不能只使用匿名和调用虚拟而不是反射吗?
这是为我的示例翻译(实现)结构类型调用的方法(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();}
});
}
}