Scala in depth 6 Scala的类型系统 中

  1. Upper bound和Lower bound

用 :> 声明 Lower bound,即父类约束, A :> B, A必须是B的父类

用 <: 声明 Upper bound, 即子类约束, A <: B  A必须是B的子类

Lower bound的例子

package ch6

object Test4 {
  println("Welcome to the Scala worksheet")
  
  class A {
    type B >: List[Int]
    def foo(a: B) = a
  }
  
  val x = new A {
    type B = Traversable[Int]
  }
  Set(1)
  x.foo(Set(1))
  
  // val y = new A { type B = Set[Int]} // 编译错误
}

由此可见, A :> B的含义是: B的父类或与B有共同父类的类型

<:B通常不会用,因为它和 :B 的效果是一样的

2. 高阶类型

像高阶函数一样,有时一个类型需要另一个类型做参数。

 type Callback[T] = Function1[T, Unit]

3.type lambda

类似与lambda 表达式表示的函数, 类型也可以这样灵活地定义,下面给出一个例子,这个例子来自

stackOverflow: http://stackoverflow.com/questions/8736164/what-are-type-lambdas-in-scala-and-what-are-their-benefits

  trait Monad[M[_]] {
    def point[A](a: A): M[A]
    def bind[A, B](m: M[A])(f: A => M[B]): M[B]
  }

  class EitherMonad[A] extends Monad[({ type λ[α] = Either[A, α] })#λ] {
    def point[B](b: B): Either[A, B]
    def bind[B, C](m: Either[A, B])(f: B => Either[A, C]): Either[A, C]
  }

4.对于一个高阶类型A[T], A[T]的兼容性随T的具体类型的变化有三种情况

假设 S<: T

(1)invariant  <=>   A[S] 不兼容 A[T]

(2) covariant <=>   A[S] <: A[T]

(3) contravariant <=> A[T] <: A[S]

原文:

A higher-kinded type that’s invariant implies that for any types T, A, and B if T[A]  conforms to T[B] then A must be the equivalent type of B
T[A] conforms T[B]可以理解为 T[A]类型的引用可以赋给T[B]类型的对象

Covariance refers to the ability to substitute a type parameter with its parent type:
For any types T, A and B if T[A]  conforms to T[B]  then A <: B

5.mutable的类型必须是invariant的。 如Array

6.Function类型的参数类型,必须contraviriant的

package ch6

object Test4 {
  println("Welcome to the Scala worksheet")       //> Welcome to the Scala worksheet

  def foo(x: Any):String = "Hello, I received a "+ x
                                                  //> foo: (x: Any)String
  def bar(x: String): Any = foo(x)                //> bar: (x: String)Any
  bar("test")                                     //> res0: Any = Hello, I received a test
  foo("test")                                     //> res1: String = Hello, I received a test
}

foo的类型为 Function1[Any, String]

bar的类型为 Function1[String, Any]

foo可以赋值给bar

时间: 2024-10-25 17:51:57

Scala in depth 6 Scala的类型系统 中的相关文章

Scala in depth 6 Scala的类型系统 上

你见过这样的函数定义吗? def square[T : Numeric](n: T) = implicitly[Numeric[T]].times(n, n) 这篇博客将揭示Scala的类型系统的众多细节 1. 总括 The more you know about Scala's type system, the more information you can give the compiler 你对类型系统了解越多,就能给编译器越多的信息 When using a type system,

Scala in depth 6 Scala的类型系统 下

接上一篇. 1. Java中是否也有声明Upper bound 和 Lower boud的语法呢? 有的,比如: List<E extends Numeric>  List<E upper Integer> 2.Java中的 List<?> 和 List<Object> 有什么区别? List<?>  代表 任意类型的 List都可以赋值给它 List<Object>  代表 List中元素的类型是任意的 package tstge;

Scala 深入浅出实战经典 第42讲:scala 泛型类,泛型函数,泛型在spark中的广泛应用

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2 技术爱好者尤其是大数据爱好者 可以加DT大数据梦工厂的qq群 DT大数据梦工厂① :462923555 DT大数据梦工厂②:437123764 DT大数据梦工厂③

[Scala基础系列 04]Scala基本类型

1.Scala的数值类型 Scala的数值类型与Java类似,他们的范围与Java也是一致的.与Java不同的是,他们都是对象,是相应的数值类的实例.Scala通过富包装(Rich Wrapper)类给这些数值类型提供了强大的支持. 1.1.数值类型 Scala的数值类型和取值范围,见下表. Boolean: true 或者 false Byte: 8位, 有符号(2-7 ~ 27 - 1) Short: 16位, 有符号 (2-15 ~ 215 - 1) Int: 32位, 有符号 (2-31

[原创]Scala学习:编写Scala脚本

scala支持脚本 1)在/opt/scala-script下创建一个文件hello.scala 编辑内容如下: $ hello ,this is the first scala script 2)运行脚本 scala脚本的命令行参数保存在名为args的scala数组中.scala里,数组以0开始,可以通过在括号里指定索引值来访问数组元素.scala里数组 args 的第一个元素是:args(0),而不是像Java那样的:args[0].现在,把以下内容写到新文件: HelloWithArgs.

Beginning Scala study note(8) Scala Type System

1. Unified Type System Scala has a unified type system, enclosed by the type Any at the top of the hierarchy and the type Nothing at the bottom of the hierarchy. All Scala types inherit from Any. # Using Any, Book extends AnyRef, and x is an Int that

Beginning Scala study note(9) Scala and Java Interoperability

1. Translating Java Classes to Scala Classes Example 1: # a class declaration in Java public class Book{} # Scala equivalent of a class declaration class Book Example 2: # a Java class with a Construtor public class Book{ private final int isbn; priv

Beginning Scala study note(6) Scala Collections

Scala's object-oriented collections support mutable and immutable type hierarchies. Also support functional higher-order operations such as map, filter, and reduce that let you use expression-oriented programming in collections. Higher-order operatio

scala学习手记16 &ndash; scala中的static

前面两节学了scala的对象和伴生对象,这两个在使用的时候很有些java的静态成员的意思. scala中没有静态字段和静态方法.静态成员会破坏scala所支持的完整的面向对象模型.不过可以通过伴生对象实现对scala的类一级的操作. 回过头来再看一遍那个Marker的例子,略做了一些调整: class Marker private(val color: String) { println("Creating " + this) override def toString(): Stri