Scala 下界介绍和应用实例 | 学习笔记

简介: 快速学习 Scala 下界介绍和应用实例

开发者学堂课程【Scala 核心编程 - 进阶Scala 下界介绍和应用实例学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/610/detail/9154


Scala 下界介绍和应用实例


内容介绍

一、Java 中下界

二、scala 中下界

三.scala 中下界应用实例


一.Java中下界

Java 泛型里表示某个类型是A类型的父类型,使用 super 关键字

<T super A>

//或用通配符的形式:

<? super A>


二.scala 中下界

scala 的下界或下限,使用 >: 关键字,语法如下

[T>:A]

//或用通配符:

[__>: A]


三.scala 中下界应用实例

object LowerBoundsDemo{

def main(args: Array[String]): Unit = {

biophony(Seq(new Earth,new Earth)).map(_.sound())

biophony(Seg(new Animal,newAnimal)).map(_.sound) biophony(Seq(new Bird,new Bird)).map(_.sound())

val res=biophony(Seq(new Bird))

val res2 =biophonyiSeg(new Object))

val res3=biophony(Seq(newMoon))

println("\nres2="+res2)

printin("\nres3="+res2)

}

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

}

class Earth{//Earth类

defsound(){//方法

printin("hello!")

class Animal extends Earth{

overridedefsound()={//重写了Earth的方法sound() printin("anhal sound")

}

}

class Bicd extends Animal

override defsound()={//将Animal的方法重写 print("bird sounds")

}

}

class Moon{}

这里单独写了一个 moon月球月亮的意思。月亮这个类不跟任何类发生关系,是独立存在的。

现在请看代码,把这个T改成大于等于 animalthings 就不调 sound。animal 有sound,但是不能保证 animal 的父类都有 sound。前面那个子类可以调是因为父类有的方法只要没选持有的,子类就可以调。这里把 things 直接返回去看区别。

调第一个方法: 

biophony(Seq(new Earth,new Earth)).map(_.sound())

先用这个方法拿到了集合,进行map,在map里面调sound。Earth是animal的父类,没有问题。

biophony(Seg(new Animal,newAnimal)).map(_.sound)

T>animal,所以第二个也是对的。

biophony(Seq(new Bird,new Bird)).map(_.sound()

这个是传了两只鸟进去,这个bird传过来,这个animal bird是他的子类按理说这地方应该报错,但是实际情况这个也是对的,这个很难理解

bird传进去,从语法上不能按照上界的思维方式来推。如果传的是animal的类,他也可以接受,但是他会按照animal的方式,按照他的父类的方式来处理。而且输出声音,还不是animal,而是鸟叫。下面运行一下代码。

新建一个案例

image.png

image.png

package com.atguigu.chapter18.lowerbounds

那么就有了一个结论:如果是下界,就可以随便传参数。

1)只不过和 Animal 直系的,是 Animal 父类的还是父类处理,是

Animal 子类的按照 Aniinal处理,

2)和 Animal 无关的,一律按照 Object 处理!

object LowerBoundsDemo01 {

def main(args: Array[String]):Unit = {

printin("ok!")

//满足下界的约束

biophony(Seq(new Earth,new Earth)).map(_.sound())

//满足下界的约束

biophony(Seq(new Animal,new Animal)).map(_.sound())

biophony(Seg(new Animal,newAnimal)).map(_.sound)

//这里我们不能使用上界的思维去推导,这里是可以运行的

biophony(Seq(new Bird,new Bird)).map(_.sound())

}

//

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

}

class Earth{//Earth类

defsound(){//方法

printin("hello!")

}

class Animal extends Earth{

overridedefsound()={//重写了Earth的方法sound() printin("anhal sound")

}

}

class Bicd extends Animal

override defsound()={//将Animal的方法重写 print("bird sounds")

}

}

class Moon{}

运行:

image.png下面再传一段代码:

//把 animal 换成 bird

biophony(Seq(new Bird,new Bird)).map(_.sound())

运行:

image.png

下面把moon传进去:

biophony(Seq(new Moon,new Moon))

image.png没有报错。

biophony(Seq(new Bird,new Bird)).map(_.sound())

这儿传了两只鸟进去,发的是鸟叫,不是动物叫。要理解这个的话要去做测试。

image.png

如果用这个方法直接输出,他返回的类型实际上是一个animal。也就是说它产生的bird这个对象实例仍然是bird,但是这个引用实际上是传给了animal,在调这个sound的时候,只是相当于这个方法去覆盖了animal的方法,那这个怎么来看这个情况?

下面这个情况只能在这个地方才能看得到,用scala运行一下看一下效果,来看看是不是他们返回的类型和我们想的是否一样:

class Earth{//Earth类

defsound(){//方法

printin("hello!")

class Animal extends Earth{

overridedefsound()={//重写了Earth的方法sound() printin("anhal sound")

}

}

class Bicd extends Animal

override defsound()={//将Animal的方法重写 print("bird sounds")

}

}

class Moon {

// def sound()=(//将Animal的方法重写

//   print(“bird sounds”)

//  }

}

先把这个方法def biophony[T>:Animal](things: Seq[T]) = things

}粘过来。这是第一个方法,有了这个方法过后再去粘贴这个bird的这个方法粘贴回车

可以看到它实际上是让一个animal这个类型自行就相当于你有两个bird的,再调上的方法的时候,其实相当于说调这个bird的时候,他还是去找,因为覆盖了animal的方法再来看第二个,如果传了一个问题粘贴回车。

image.png

那么得出结论:如果传的是跟他没有任何关系返回的就是object。那么我们再来看一个这个类型,把biophony(Seq(new Earth,new Earth))粘过来,这时返回的就是earth本身:

   

image.png

如果有方法覆盖,那仍然是调动的子类的。假如bird里面没有sound的方法,可以看一下他的是什么声音。保存为了好看先把它处理掉

//biophony (seq(new moon))

现在为什么调sound也能成功?因为他其实是按照animal来进行这个继承关系的处理。

传了两个鸟进去,仍然叫sound成功了。这个时候会发出动物的叫声。

image.png

image.png

以上就是要讲的案例。

相关文章
|
7月前
|
SQL Java 关系型数据库
Scala应用 —— JDBC的创建
这篇文章介绍了如何使用Scala实现JDBC连接。首先,通过在pom.xml添加MySQL JDBC驱动依赖,然后使用`Class.forName()`加载驱动,接着创建连接对象。初始化执行器涉及创建执行器对象和设置参数。执行操作时,根据DML(数据修改语言)和DQL(数据查询语言)返回不同结果。文章提出了一个柯里化的`jdbc`函数,以处理不同操作步骤和多类型结果。结果类型通过枚举和抽象类`Three`的子类来表示,包括异常、DML影响行数和DQL查询结果。最后,展示了`jdbc`方法的实现,以及如何处理结果并转换为具体对象。代码示例中,查询结果被转换为`Test`对象数组并打印。
102 2
Scala应用 —— JDBC的创建
|
7月前
|
数据采集 JSON 数据处理
一步步实现知乎热榜采集:Scala与Sttp库的应用
使用Scala和Sttp库,结合代理IP,本文阐述了爬取并处理知乎热榜数据的方法。首先,确保安装Scala和SBT,然后在`build.sbt`引入Sttp等相关依赖。代码中,设置代理服务器信息、User-Agent和Cookie,发送GET请求获取数据。解析JSON数据后,归类和统计不同类型条目的数量,例如文章和问题。运行示例输出归类和统计结果,为数据分析提供基础。
一步步实现知乎热榜采集:Scala与Sttp库的应用
|
分布式计算 Java 大数据
|
Scala 开发者
Scala 上界介绍和应用实例2 | 学习笔记
快速学习Scala上界介绍和应用实例2
Scala 上界介绍和应用实例2 | 学习笔记
|
Java Scala 开发者
Scala 泛型介绍和应用实例2 | 学习笔记
快速学习 Scala 泛型介绍和应用实例2
Scala 泛型介绍和应用实例2 | 学习笔记
|
Scala 开发者 索引
关联 Scala 源码|学习笔记
快速学习关联 Scala 源码。
209 0
|
Java 大数据 Scala
scala 对象创建的流程分析|学习笔记
快速学习 scala 对象创建的流程分析。
111 0
|
2月前
|
分布式计算 大数据 Java
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
75 5
|
2月前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
56 3
|
2月前
|
消息中间件 分布式计算 NoSQL
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
48 0