文档章节

Scala Structural Typing结构类型

谦谦君子
 谦谦君子
发布于 2014/09/15 20:41
字数 313
阅读 460
收藏 1

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

一般在动态语言里面才有,因为静态语言是强类型的,会在编译期检查类型,很难实现。但是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

© 著作权归作者所有

谦谦君子
粉丝 37
博文 61
码字总数 56919
作品 0
成都
程序员
私信 提问
Scala的级别:初学者到专家,程序员到类库设计者

Created by odersky on 2011-01-16. Updated: 2011-01-16, 17:35 Scala有一些善变和灵活。它令许多编程任务变得简单,但是同时它还包含了一些复杂的结构以便专家来设计真正高级的,类型安全的...

崔钢
2011/02/20
620
2
函数式编程与面向对象编程[4]:Scala的类型关联Type Alias

函数式编程与面向对象编程[4]:Scala的类型关联Type Alias 之剑 2016.5.4 23:55:19 类型关联 Type Alias type关键字 scala里的类型,除了在定义class,trait,object时会产生类型,还可以通过t...

程序员诗人
2016/05/06
0
0
Scala类型 : 结构类型

所谓”结构类型“,指的是一组关于抽象方法、字段、类型的规格说明。 结构类型(structural type)为静态语言增加了部分动态特性,使得参数类型不再拘泥于某个已命名的类型,只要参数中包含结构...

xtof
2018/11/23
19
0
golang基础--Interface接口

接口是一个或多个方法签名名的集合,定义方式如下 只要某个类型拥有该接口的所有方法签名,就算实现该接口,无需显示声明实现了那个接口,这称为structural Typing 接口可以作为匿名嵌入其它...

failymao
2018/07/16
0
0
Scala的foreach和for枚举功能一瞥

一句印象深刻的话,Alan Kay(Smalltalk发明者)说得一句话: “I’m not against types, but I don't know of any type systems that aren't a complete pain, so I still like dynamic ty......

hanzhankang
2014/02/15
618
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot + Mybatis + Ehcache 二级缓存实例

二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,不同的sqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,第一次执行完毕...

xiaolyuh
21分钟前
4
0
Spring源码学习(二)哎呦,按菜谱做菜与AbstractAutowireCapableBeanFactory.createBean流程差不多

记得跟老婆谈恋爱时,有一天心血来潮给老婆做饭,按照菜谱一步一步的做,结果差点把厨房烧了!!! 这事至今老婆还记得。 入口 上一篇说了,AbstractBeanFactory.getBean的主流程 ,今天来说下...

温安适
23分钟前
36
0
前端UI攻城狮 你们该抛弃jQuery了

你不再需要jQuery! Web工程师太依赖jQuery了,某种意义上说jQuery已经成了JavaScript的同义词。但是我们真的需要他么?或许我们应该反思一下什么时候才真的需要jQuery。 对我个人而言开始使...

前端老手
25分钟前
5
0
六、Java设计模式之工厂方法

工厂方法定义: 定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行 类型:创建型 工厂方法-使用场景: 创建对象需要大量重复的代码 ...

东风破2019
今天
6
0
win服务器管理遇到的一系列问题记录

有些小伙伴在使用iis7远程桌面管理工具的时候总是会遇到一系列的问题,下面就是为大家介绍一下服务器日常管理过程中出现的问题及我的解决办法和心得。希望能帮到大家。   拒绝服务器重新启...

1717197346
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部