从零学scala(九)类型参数、高级类型

一:类型参数

泛型类

//泛型类,基本和java是一致的
         class Pair[T,S](val first:T,val second:S)

val pair1 = new Pair("42",42)
         val pair2 = new Pair[Any,Any](42,"42")

泛型函数

//返回数组中间的值
         def getMiddle[T](a:Array[T]) = a(a.length/2)

def main(args: Array[String]): Unit = {
                  val f = getMiddle(Array("a","b","c","d","e"))
                  println(f.mkString("|"))
         }

类型变量界定

//定义一个参数类,它必须是Comparable的子类
         class Middle[T <: Comparable[T]](val first:T ,val second:T) {
                  val smaller = if(first.compareTo(second) < 0) first else second
         }

视图界定

//使用<%的含义是可以将变量隐式转换为Comparable的子类。前提是必须存在这种隐式转换!!!
          class Middle[T <% Comparable[T]](val first:T ,val second:T) {
                    val smaller = if(first.compareTo(second) < 0) first else second
          }

上下文界定

//必须存在一个一个类型为Ordering的值
          class Middle[T : Ordering](val first:T ,val second:T) {
                    def smaller(implicit ord:Ordering[T])
                              = if(ord.compare(first,second) < 0) first else second
          }

Manifest上下文界定

//在虚拟机中,泛型相关的类型信息是被抹除的,所有Array方法只有一个
          //方法。例如你调用int类型的,只是产生了一个intManifest方法

def makePair[T:Manifest](first:T,second:T){
                    val r = new Array[T](2)
                    r(0) = first
                    r(1) = second
                    r
          }

多重界定

//上界和下界
          Lower >:makePair <: Upper
          //类型实现多个特质
          makePair <: Compareable[makePair] with Serializable with Cloneable
          //多个试图界定
          makePair <% Compareable[makePair] <% String
          //多个上下文界定
          makePair : Ordering : Maifest

类型约束

// T =:= U T是否等于U
          // T <:< U T是否U的子类型
          // T =%= U T能否被隐式转换为U类型
          class Pair[T](first:T,second:T){
                    implicit ev:T =:=Compareable[T]
          }

型变

//T类型及子类型可以访问:协变
          class Pair[+T](first:T,second:T){}
          //逆变:父类传递参数到子类
          class Pair1[-T](first:T,second:T){}

协变和逆变点

对象不能泛型

类型通配符

二:高级类型

单例类型

这个就不多说了,在java里面经常用.但是有一个特殊的地方,关于返回类型:

class Document{
                def setTitle(title:String) ={
                        println("title:"+title)
                        this
                }
        }
        class Book extends Document{
                def setPrice(price:String) ={
                        println("price:"+price)
                        this
                }
        }

val book = new Book
        book.setPrice("bb").setTitle("aa")    //这时候代码会报错,因为book没有setTitle方法

class Document{
                def setTitle(title:String):this.type ={//修改返回格式
                        println("title:"+title)
                        this
                }
        }
        class Book extends Document{
                def setPrice(price:String):this.type ={//修改返回格式
                        println("price:"+price)
                        this
                }
        }

类型投影

class Network {
                class Member(val name: String) {
                        var contacts = new util.ArrayList[Member]()
                }
                private val members = new ArrayBuffer[Member]()

def join(name: String): Member = {
                        val m = new Member(name)
                        members += m
                        m
                }
        }

val chatter = new Network
        val myFace = new Network

val fred = chatter.join("Fred")
        val barney = myFace.join("Barney")
        fred.contacts.add(barney)//这时候chatter和myFace的Member是不同

var contacts = new util.ArrayList[Network#Member]() //将类型变为只要是Member就行

路径

val aa = new Network#Member

println(aa.contacts)//new内部类对象

类型别名

并没有试验出来书上的效果.尴尬尴尬

class Book{
                    import scala.collection.mutable._
                    val Index = HashMap[String,String]
          }

可以直接使用Book.Index来重命名HashMap,但是没有起作用

结构类型

复合类型

中置类型

存在类型

scala类型系统

自身类型

依赖注入

抽象类型

家族多态

高等类型

原文地址:https://www.cnblogs.com/wuxiaolong4/p/12005203.html

时间: 2024-10-28 07:44:07

从零学scala(九)类型参数、高级类型的相关文章

从零学scala(二)数组相关操作、映射和元组

一:数组相关操作 定长数组 val array = Array[String]("a","b","c") //直接初始化数组的内容        println(array.mkString("|")) val array = new Array[String](2) //new一个长度为2的数据在通过更新的方法进行赋值        array.update(0, "0")        array.up

从零学scala(五)文件和正则表达式、特质

一:文件和正则表达式 读取行 import scala.io.Source         val lines = Source.fromFile("D://report_data2.txt","UTF-8").getLines()            for( i <- lines) println(i)//遍历每一行的数据 val array = Source.fromFile("D://report_data2.txt","

从零学scala(七)集合、模式匹配和样例类

一:集合 主要的集合特质 scala集合中重要的特质: Trait(Iterable) Trait(Seq) Trait(Set) Trait(Map) Trait(IndexedSeq) Trait(SoredSet) Trait(SoredMap) Seq是一个有先后次序的值的序列,比如数组和列表.IndexSeq允许我们通过下表快速访问元素,ArrayBuffer是带下标的,但是链表不是. Set是一个没有先后次序的值的序列,SortedSet中,元素以排过序的顺序被访问. Map是一组(

scala一些高级类型

package com.ming.test import scala.collection.mutable.ArrayBuffer import scala.io.Source import java.awt.image.BufferedImage import javax.imageio.ImageIO import java.io.File /** * 高级类型 */ //单例类型,链式调用 class Document{ def setTitle(title:String)={this}

Scala入门到精通——第二十四节 高级类型 (三)

作者:摆摆少年梦 视频地址:http://blog.csdn.net/wsscy2004/article/details/38440247 本节主要内容 Type Specialization Manifest.TypeTag.ClassTag Scala类型系统总结 在scala中,类(class)与类型(type)是两个不一样的概念.我们知道类是对同一类型数据的抽象,而类型则更详细. 比方定义class List[T] {}, 能够有List[Int] 和 List[String]等详细类型

快学Scala 第十九课 (trait的abstract override使用)

trait的abstract override使用: 当我看到abstract override介绍的时候也是一脸懵逼,因为快学scala,只介绍了因为TimestampLogger中调用的super.log依旧是个abstract class,所以必须在方法前加上abstract和override.但是并没有具体介绍如何使用,然后查阅了其他文档,才明白使用方法. 下面的代码定义了超类LoggerEmpty,这个定义意味着该特质只能混入扩展LoggerEmpty的类中. 在特质中声明抽象方法中有

快学scala笔记.

第一章 基础 val 定义的值实际上是一个常量 var 声明其值可变的变量 val xmax,ymax = 100 var greeting,message: String = null 1.3 常用类型 Scala的7种数值类型:Byte.Char.Short.Int.Long.Float和Double 1.toString() 2.to(10) "Hello".intersect("World") 1.4 算术和操作符重载 val answer = 8 * 5

[Scala] 快学Scala A2L2

集合 13.1 集合的三大类 所有的集合都扩展Iterable特质.集合的三大集合为Seq, Set, Map Seq是一个有先后次序的值的序列,比如数组或列表.IndexSeq允许我们通过整型下表快速访问任意元素.但是链表不可以. Set是一组没有先后次序的值.SortedSet中,元素排过序. Map时一组(键,值)对.SortedMap按键排序 每一个Scala集合特质或类都有一个带有apply 方法的伴生对象. 13.2 可变和不可变集合 13.3 序列Sequence 不可变序列:In

快学Scala课后习题答案

分享一个之前做快学Scala的课后习题(2-21章节,19无)的Github链接,我把习题的文字写在了每个回答的注释上面,这样方便大家对照着看,省的回过头去对照着pdf看了,如果有做的不对的地方希望大家给予指正. 链接如下,http://github.com/fxxkinglife/scala-hello. 举一个第二章节的例子, object charpter02 { /* * 2.1 * 一个数字如果为正数,则它的signum为1; * 如果是负数,则signum为-1; * 如果为0,则s