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}
  def setAuthor(author:String)={this}
}

class Book extends Document{
  def addBook(name:String):this.type={this}
}

//类型投影
class NetWork{
  class Member(val name:String){
    val contacts=new ArrayBuffer[Member]
  }
  private val members=new ArrayBuffer[Member]
  def join(name:String)={
    val m=new Member(name)
    members+=m
    m
  }
}

//定义Person类,两个泛型参数,分别是S,T,因此
//它是可以用中置表达式进行变量定义的
case class Person[S,T](val name:S,val age:T)
//中置类型-中置类型是代表带有两个参数的类型
class ZhongziType{
  //下面的代码是一种中置表达方法,相当于
  //val p:Person[String,Int]
  val p:String Person Int= Person("摇摆少年梦",18)
}

//抽象类型--类或特质可以定义一个在子类中被具体化的抽象类型
trait Reader{
  type Contents
  def read(fileName : String):Contents
}

trait Reade1r[T]{
   def read(fileName : String):T
}

//类型Contents是抽象的。具体的子类需要指定这个类型
class StringReader extends Reader{
  type Contents=String
   def read(fileName : String)=Source.fromFile(fileName,"UTF-8").mkString
}

class ImageReader extends Reader{
  type Contents=BufferedImage
  def read(fileName :String)=ImageIO.read(new File(fileName))
}

//

object SeniorTypeTest {

  def main(args: Array[String]): Unit = {
    var d=new Book
    var s=d.setAuthor("a").setTitle("hello");
    println(s)
    var b=new Book
    b.addBook("<<helloworld>>").setAuthor("mingge").setTitle("hello")
    println(b)
  }
}

感觉scala好多规则,好晕好绕。。。

时间: 2024-10-17 05:35:50

scala一些高级类型的相关文章

从零学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 mai

从C#到TypeScript - 高级类型

C# vs TypeScript - 高级类型 上一篇讲了基础类型,基本上用基础类型足够开发了,不过如果要更高效的开发,还是要看下高级类型,这篇和C#共同点并不多,只是延用这个主题. 联合类型 可以从字面上进行理解:其实就是多个类型联合在一起,用|符号隔开.如: string | number, 表示希望这个类型既可以是string,又可以是number.联合类型的字段只能调用这些类型共同拥有的方法,除非类型推论系统自动判断出真正的类型. //这里sn就是一个联合类型的字段,由于类型推论推断出s

Scala 深入浅出实战经典 第53讲:Scala中结构类型实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/pR_4sY0cJLs/优酷:http://v.youku.com/v_show/id_

Scala 深入浅出实战经典 第54讲:Scala中复合类型实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/a6qIB7SqOlc/优酷:http://v.youku.com/v_show/id_

【Go入门教程3】基本类型 和 高级类型

基本类型 Go 有很多预定义类型,这里简单地把它们分为 基本类型 和 高级类型.Go 的基本类型并不多,而且大部分都与整数相关,如下表所示: 名 称 宽度(字节) 零 值 说 明 bool 1 false 布尔类型,其值不为真即为假.真用常量 true 表示,假由常量 false 表示 byte 1 0 字节类型,它也可以看作是一个由 8 位二进制数表示的无符号整数类型 rune 4 0 rune 类型,它是有 Go 语言定义的特有的数据类型,专用于存储 Unicode 字符.它也可以看作一个由

Scala学习 - 基础类型

Scala中的类型相对于Java来说,与.net的想法更为接近,所有的类型都是基于一个基础类型,包括值类型也是继承自该类型: Java中值类型是语言直接提供的,这点上有点不同: 类型关系图如下: 其中所有类型的基类与Any Any之后分为两个AnyVal与AnyRef 其中AnyVal是所有值类型的父类型 AnyRef是所有引用类型的父类型 与其他语言稍微有点不同的是,Scala还定义了底类型 其中Null类型是所有引用类型的底类型,及所有AnyRef的类型的空值都是Null 而Nothing是

013 --TypeScript之高级类型

交叉类型可以简单理解为将多个类型合并成一个类型 function extend<T, U>(first: T, second: U): T & U { let result = {} as T & U for(let id in first) { result[id] = first[id] as any } for(let id in second){ if(!result.hasOwnProperty(id)){ result[id] = second[id] as any

TS(6)-- 类型推论、类型兼容性、高级类型

2019-11-09: 学习内容:类型推论.类型兼容性.高级类型 一.类型推论:类型是在哪里如何被推断的 在有些没有明确指出类型的地方,类型推论会帮助提供类型.如:let x = 3;  变量x的类型被推断为数字. 这种推断发生在初始化变量和成员,设置默认参数值和决定函数返回值时.大多数情况下,类型推论是直截了当地. 最佳通用类型:如: let x = [0, 1, null];   两种选择:number 和 null , 计算通用类型算法会考虑所有的候选类型,并给出一个兼容所有候选类型的类型

scala简要:高级函数和高级类型

在scala中,函数是头等公民,可以用变量存储函数,可以使用匿名函数,和带参数的函数.如果需要一个序列的值,一般从一个简单序列转化得出.函数可以在变量不再作用域内时被调用,这样的函数叫闭包. 柯里化是指将原来接受两个参数变成接受一个参数的函数的过程.不需要用return语句来返回函数值,函数的返回值就是函数体的值. scala中,用方括号来定义类型参数,从调用该方法的实际参数来推断出类型.视图界定 T<%V要求必须存在一个从T到V的隐式转换,Manifest对象是构造器的隐式参数,可用于上下文界