scala duck typing

Posted on 2010-01-12 18:02 xsong 阅读(126) 评论(0)  编辑  收藏

 

class A {
  
void call() {}  
}
  
class B extends A {
  
void call() {}  
}
  
class C {
  
void call() {}  
}
 
void foo(A a){
}

A a
=new A();
foo(a); 

C c
=new C();
foo(c);
java编译器无法通过, 因为C不是A或者A的子类 虽然 C 中也有 call 方法。

scala 中可以通过 结构类型(Structural)实现
class A {
  def call() 
{
    println(
"a class")
  }

}

class B extends A {override def call() {}}
class C {
  def call() 
{
    println(
"c class")
  }

}


object Call 
{
  def main(args: Array[String]) 
{
    def foo[T 
<{ def call() }](a : T) {
      a.call()
    }

    val a 
= new A()
    val c 
= new C()
    foo(a)
    foo(c)
    println()
  }

}

不过觉得  def foo[T <: { def call() }](a : T)  这样的写法 不如动态语言(ruby, groovy..)看起来自然。

只有注册用户登录后才能发表评论。


网站导航: