码迷,mamicode.com
首页 > 其他好文 > 详细

Scala Structural Typing结构类型

时间:2014-09-15 23:00:39      阅读:415      评论:0      收藏:0      [点我收藏+]

标签:style   http   color   io   os   使用   java   ar   art   

鸭子类型“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

一般在动态语言里面才有,因为静态语言是强类型的,会在编译期检查类型,很难实现。但是Scala作为一门static type语言,居然支持,不得不说Scala确实很强大。直接上code

package testscala

object StructuralTyping extends App {
  def quacker(duck: {def quack(value: String): String}) {
    println(duck.quack("Quack"))
  }

  object BigDuck {
    def quack(value: String) = {
      value.toUpperCase
    }
  }

  object SmallDuck {
    def quack(value: String) = {
      value.toLowerCase
    }
  }

  object IamNotReallyADuck {
    def quack(value: String) = {
      "prrrrrp"
    }
  }

  quacker(BigDuck)
  quacker(SmallDuck)
  quacker(IamNotReallyADuck)

  //  object NoQuaker {
  //  }
  //
  //  quacker(NoQuaker) // 编译错误!!!!

  val x = new AnyRef {
    def quack(value: String) = {
      "No type needed " + value
    }
  }
  quacker(x)

}



不过Scala编译成Reflection实现,"

Why scala uses reflection to call method on structural type?

"。当然里面说性能差事反射的性能问题,随着JVM引入invokedynamic  指令,会有很大的性能提升,但是这只在JVM1.7才有,但是scala2.11还支持JVM1.6, 所以最好还是不要大量使用,当然目前貌似也没有太多使用的,可以看这篇文章“

Why No One Uses Scala’s Structural Typing



Ref

1. http://en.wikibooks.org/wiki/Scala/Structural_Typing

2. http://java.dzone.com/articles/duck-typing-scala-structural

3. http://www.draconianoverlord.com/2011/10/04/why-no-one-uses-scala-structural-typing.html

4. http://stackoverflow.com/questions/8539422/why-scala-uses-reflection-to-call-method-on-structural-type

Scala Structural Typing结构类型

标签:style   http   color   io   os   使用   java   ar   art   

原文地址:http://my.oschina.net/magicly007/blog/313863

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!