最近又在重温Scala编程。上bilibili网站看了韩顺平老师在尚硅谷的Scala编程语言的教学视频。发现韩老师有关Scala下界的介绍与示例说明,讲解的不是很清晰。并认为可能会给一些学习Scala的新手造成一些理解的误区。本人通过敲代码亲自实验体会了一下。谈谈自己的理解,希望能帮助学习Scala语言的同学,对下界的理解。同时,如果觉得本人理解有误的,也欢迎批评指正。

话不多说,直接谈下界的理解。首先定义了一个方法:

def biophoy[T >: Animal](things:Seq[T]) = things    

其中,T >: Animal 表示类型T 应为Animal的父类,Animal为下界(类),这里称之为A类吧。

在实际使用时,会发现,其实T为Animal的子类或无关类都无所谓,都能使用biophoy方法,把自己的对象放进去。那么,下界到底起了什么作用呢?本人理解如下:

 定义了下界,就是限定可以调用的方法范围(可使用的方法数量),可调用的方法是:

1、T与下界类A有继承关系时,

      <1> 传入类T是下界类A的同类或父类,方法范围是传入类T+下界类A的方法交集+传入类T自身及其父类的方法;

      <2> 传入类T是下界类A的子类,方法范围是下界类及其以上父类的所有方法。

而调用方法的实现,则一定是调用层级关系最近的那个方法实现。即:Self.function (自己)> direct-parent.function (父亲)> grandpa.function (爷爷)

2、没有继承关系的,即传入类T与下界类A无关。则自定义方法(biophoy)可调用的方法范围是Object(他们都属于Object)。

示例代码:
object App {def foo(x : Array[String]) = x.foldLeft("")((a,b) => a + b)def main(args : Array[String]) {val a:Tuple2[String,Int] = Tuple2("1",0)val astr = a.productIterator.mkString("\t")println(astr)println( "Hello World!" )println("concat arguments = " + foo(args))biophoy(Seq(new Earth))biophoy(Seq(new Bird)).map(_.cry())biophoy(Seq(new Bird)).map(_.roar())biophoy(Seq(new Animal)).map(_.cry())}def biophoy[T >: Animal](things:Seq[T]) = thingsclass Earth {def sound(): Unit ={println("Earth sound....")}def cry(): Unit ={println("Earth cry....")}}class Animal extends Earth{override def sound(): Unit ={println("Animal sound....")}def roar() = {println("Animal roar....")}}class Bird extends Animal{override def sound(): Unit ={println("Bird sound....")}def laugh(): Unit ={println("Bird laugh....")}}}

由上述代码不难发现(如果你亲自敲一下代码),在任何使用 def biophoy[T >: Animal](things:Seq[T]) = things 定义的函数时,都无法找到下界以下类所定义的方法,但可以找到传入类T与下界类A的交集方法,及其父类包含的方法。例如:Bird实现了laugh方法,但由于下界类及其父类Earth类均未定义laugh方法。因此,在biophoy(Seq(new Bird)).map(_.laugh)会报错,因为无法找到laugh方法。但如果子未实现该方法,它就会自动调用父类的该方法。例如:Bird调了自己未有的cry方法,最终调用的是父类Earth实现的方法。这是因为Animal没有定义cry方法的实现;如果Animal有定义cry,那就是调用Animal的cry方法实现。又例如:Bird调了其父类或爷爷类具有的sound方法。那么,首先sound方法允许被调用(即可以被_.找到sound方法)。另外,调用的一定是层级关系最近的实现,即调用Bird类自己实现的sound方法。从运行结果可知,上述描述均得以验证。

下界类主要是结合继承关系,来限定可调用方法的。这里再举例说明下:

当传入类T是下界类A的父亲时,即T=Earth类,可调用的方法范围是:{sound,cry}。注意,下界类A的roar就不能被调用;

当传入类T是下界类A的子类时,即T=Birth类,可调用的方法范围是:{sound,cry,roar},注意,子类Bird的独有的方法laugh是不可调用。

当传入类T是下界类的无关类,即两个类毫无继承关系时,那么,biophoy方法则均视为Object类。各种方法,都无法调用。这其实应该就不是Scala语言设计者的初衷。所以,T虽然可以把对象放入定义了下界类的方法(biophoy),但毫无意义。因此,T就应该放入下界类的父类。从而使得,自定义方法(biophoy)中的对象,都具有可知(清晰)范围的方法被使用。

Scala编程——下界介绍与实例分析相关推荐

  1. python网络通信编程实例_python网络编程之数据传输UDP实例分析

    本文实例讲述了python网络编程之数据传输UDP实现方法.分享给大家供大家参考.具体分析如下: 一.问题: 你觉得网络上像msn,qq之类的工具在多台机器之间互相传输数据神秘吗?你也想玩一下在两台机 ...

  2. Redis高级特性介绍及实例分析

    本文将为大家介绍Redis的一些高级特性以及结合一个具体的实际案例来对Redis进行设计分析. Redis基础类型回顾 String Redis中最基本,也是最简单的数据类型.注意,VALUE既可以是 ...

  3. SharePoint 2013 Search KQL 介绍及实例分析

    KQL是Keyword Query Language(关键字查询语言的缩写),在SharePoint 2013 Search 中可以使用KQL来查询(最长2048个字符): 1. KQL可以直接在界面 ...

  4. 数控机床的c语言编程,数控机床的编程方法和典型实例分析

    (1)确定加工路线按先主后次,先精后粗的加工原则确定加工路线,采用固定循环指令对外轮廓进行粗加工,再精加工,然后车退刀槽,最后加工螺纹.(2)装夹方法和对刀点的选择采用三爪自定心卡盘自定心夹紧,对刀点 ...

  5. 数控车计算机软件编程的重要性,数控车床程序数控机床的编程方法和典型实例分析...

    (1)确定加工路线按先主后次,先精后粗的加工原则确定加工路线,采用固定循环指令对外轮廓进行粗加工,再精加工,然后车退刀槽,最后加工螺纹.(2)装夹方法和对刀点的选择采用三爪自定心卡盘自定心夹紧,对刀点 ...

  6. python多进程编程实例_[python] Python多进程编程技术实例分析

    这篇文章主要介绍了Python多进程编程技术,包括了线程.队列.同步等概念及相关的技巧总结,需要的朋友可以参考下 本文以实例形式分析了Python多进程编程技术,有助于进一步Python程序设计技巧. ...

  7. 西门子S7-200SMART介绍及实例编程

    西门子S7-200SMART介绍及实例编程 (何工_2018年9月5号) 概述:SIMATIC S7-200 SMART 是西门子公司经过大量市场调研,为中国客户量身定制的一款高性价比小型 PLC 产 ...

  8. scala函数式编程(二) scala基础语法介绍

    上次我们介绍了函数式编程的好处,并使用scala写了一个小小的例子帮助大家理解,从这里开始我将真正开始介绍scala编程的一些内容. 这里会先重点介绍scala的一些语法.当然,这里是假设你有一些ja ...

  9. 华兴数控g71外圆循环编程_数控车床加工编程典型实例分析(西门子802S数控系统)...

    这是一篇带有教学色彩的习作,文章对数控编程的方式和步骤进行了简明的阐述,并针对一个典型零件的数控车削加工给出了一套程序.程序是以西门子802S数控系统为例编写的. 数控机床是一种技术密集度及自动化程度 ...

最新文章

  1. ubuntu下wget下载Linux内核源码、make生成.config文件
  2. sqlite字段是否存在_学习廖雪峰的JAVA教程---反射(访问字段)
  3. Css网格布局-Grid布局
  4. oracle 事务测试
  5. 通过java类的反射机制获取类的属性类型
  6. java中拷贝文件的代码_拷贝文件夹中的所有文件到另外一个文件夹
  7. python的py文件打包成exe_将python项目.py文件打包成.exe文件
  8. 开始使用 Markdown
  9. 运维管理_运维BIM软件-EcoDomus运维管理系统
  10. 《异星入境》-超粒方
  11. idea 如何查看jdk源码
  12. 08.15恒指/德指做单思路导图及晚盘前瞻
  13. 让你百分百玩转抖音!
  14. Diffusion models代码解读:入门与实战
  15. 欧文分校的计算机科学博士,加州大学欧文分校计算机科学硕士排名第37(2020年TFE Times排名)...
  16. 操作系统--Linux操作系统第一期
  17. 11g v$active_session_history的列说明
  18. C# SerialPort配置和属性了解
  19. JS判断输入的是否汉字
  20. Windows11快捷键

热门文章

  1. 纠删码在实时视频流中的应用丨Dev for Dev 专栏
  2. Web组态编辑器赋能智慧石油生产储运2D可视化
  3. HI3518E SDK安装并编译osdr
  4. 「云安全」 什么是云访问安全代理(CASB )?
  5. 巴菲特卸任后盖茨梅琳达与四位新理事共管盖茨基金会;Club Med中国第三家冰雪度假村开业 | 美通社头条...
  6. BZOJ3032 七夕祭 均分纸牌问题的变式 (前缀和+中位数)
  7. EasyDarwin开源流媒体服务器内存管理优化
  8. 我是一名项目经理,把一个项目带崩了--案例分析
  9. 基于树莓派的Azure物联网实践(一)
  10. 【Linux】解压缩命令