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, it’s best to think of it as an overprotective father. It
will constantly warn you of problems or prevent you from doing things altogether.
The better you communicate with the type system, the less restrictive it becomes.
But if you attempt to do something deemed inappropriate, the compiler will warn
把类型系统看作一个过度保护你的父亲,在你做不合适的事时就不停地警告你

2. 什么是类型?

对于编译器而言,类型意味着一组信息:一个变量应该是那个类的实例,对这个变量可以进行哪些操作

3. 创建类型的方法

(1) 定义 class, trait, object

(2) 使用type关键字

4. 类型的名字

如果通过定义class或trait定义类型,类型的名字就是class或trait的名字。如果是object,类名并没有太多意义,编译器有生成类名的一套规则

package ch6

object TestType {
  println("Welcome to the Scala worksheet")       //> Welcome to the Scala worksheet
  
  object T
  T.getClass                                      //> res0: Class[?0] = class ch6.TestType$$anonfun$main$1$T$2$
}

5. 那么object最为函数的参数时如何声明类型呢? object名字.type

object  Obj {
  val ss = 22
}

def f(obj: Obj.type ):Unit = println(obj.ss)
f(Obj)

6. 对内部类的引用有两种方式 , hash(#)和dot(.),且看下面的例子

package ch6

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

  class Outer {
    trait Inner
    def y = new Inner {}
    def foo(x: this.Inner) = null
    def bar(x: Outer#Inner) = null
  }
  
  val x = new Outer                               //> x  : ch6.Test2.Outer = [email protected]
  val y = new Outer                               //> y  : ch6.Test2.Outer = [email protected]
  x.y                                             //> res0: ch6.Test2.x.Inner = [email protected]
                                                  //| 
  x.foo(x.y)                                      //> res1: Null = null
  x.foo(y.y) //type mismatch;  found   : ch6.Test2.y.Inner  required: ch6.Test2.x.Inner
  x.bar(y.y)                                      //> res2: Null = null

}

对象.类型   把类型绑定到了一个特殊的对象上

#的要求就没有那么严格了

7.type关键字的用法1

type AbstractType   //定义一个抽象类型(不是抽象类)
  type ConcreteType = SomeFooType  //定义一个具体类型
  type ConcreteType2 = SomeFooType with SomeBarType // 定义一个组合型的具体类型

8.type关键字用法2: 定义带结构的type

方法f的参数是一个带有方法g的类型。 要表达这样的含义就要用到structural type。

通常情况下,一个对象是什么类型要从它是什么class,它继承了什么class或它带来那些trait。

但是这样的语义并不是完全的。比如生活中我们常用这样的语句表达一个类型:带有水壶架的自行车。如果自行车没有继承水壶架类,或根本没有水壶架类,那么这样的意思在scala中该怎么表达呢?

package ch6

object Test3 extends App{
  object Resources {
    type Resource = {
      def close(): Unit
    }

    def closeResource(r: Resource) = {
      r.close()
      println("resource closed")
    } 

  }

  Resources.closeResource(System.in)
}

Resource就是我们自己定义的一个带close方法的类型

时间: 2024-10-13 19:50:04

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

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 in depth 6 Scala的类型系统 中

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 >: Li

Spark2.0从入门到精通:Scala编程、大数据开发、上百个实战案例、内核源码深度剖析视频教程

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

[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

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

[原创]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(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中List的Scala中List和ListBuffer设计实现

学习了Scala中List的Scala中List和ListBuffer设计实现思考,scala list 内部很多操作是listbuffer做的,因为改变元素,listbuffer非常高效,我们看见tl是var类型的  ,但是他属于scala包及子包,我们看上去是可变的,但是由于包 的限制我们看不到. list列表 追加元素,如果tl前面没有 private[scala],可以改变除了第一个元素,其他所有元素构建的list,因为我们有同样的 tl,追加不同的元素,构造不同的列表,可以共享case