scala duck typing

 

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..)看起来自然。

你可能感兴趣的:(scala duck typing)