scala类型系统:8) type关键字

scala里的类型,除了在定义class,trait,object时会产生类型,还可以通过type关键字来声明类型。

type相当于声明一个类型别名:

scala> type S = String
defined type alias S

上面把String类型用S代替,通常type用于声明某种复杂类型,或用于定义一个抽象类型。

场景1 用于声明一些复杂类型,比如下面声明一个结构类型

scala> type T = Serializable {
 |          type X
 |          def foo():Unit
 |     }
defined type alias T

这个结构类型内部也允许通过type来定义类型,这里对X没有赋值表示X是一个抽象类型,需要子类型在实现时提供X具体的类型。下面是一个T类型的具体实例:

scala> object A extends Serializable{ type X=String; def foo(){} }

scala> typeOf[A.type] <:< typeOf[T]
res19: Boolean = true

场景2 用于抽象类型

scala> trait A { type T ; def foo(i:T) = print(i) }

scala> class B extends A { type T = Int }

scala> val b = new B

scala> b.foo(200)
200

scala> class C extends A { type T = String }

scala> val c = new C

scala> c.foo("hello")
hello

scala类型系统:8) type关键字》上有5条评论

  1. lcn

    呃,感觉应该先abstract type member后type alias,毕竟前者是功能性的,后者只是sugar。

    回复
  2. hary

    这里如何解释?

    scala> type S = String
    defined type alias S

    scala> typeOf[String]
    res14: reflect.runtime.universe.Type = String

    scala> typeOf[S]
    res15: reflect.runtime.universe.Type = S

    scala> typeOf[S] == typeOf[String]
    res16: Boolean = false

    回复
    1. hongjiang 文章作者

      你这是两个对象的引用比较,要证明这两个类型是否相同用:
      typeOf[S] =:= typeOf[String]

      回复
      1. hary

        有道理。
        应该用getClass试试。

        typeOf[T] 是一个Type对象。

        不过 typeOf[S] =:= typeOf[String]这个也是不对的哦, 因为 =:= 的意思是 =:=[X, Y] , 产生一个新的类型。
        scala> typeOf[S] =:= typeOf[String]
        :9: error: not found: value typeOf
        typeOf[S] =:= typeOf[String]
        ^
        :9: error: not found: value typeOf
        typeOf[S] =:= typeOf[String]
        ^

        scala> type S = String
        defined type alias S

        scala> val k = new S
        k: String = “”

        scala> val t = new String
        t: String = “”

        scala> k.getClass
        res0: Class[_ t.getClass
        res1: Class[_ <: String] = class java.lang.String

        回复
  3. hongjiang 文章作者

    用 =:=[A, B] 可以证明A,B两个类型是否等价的,B是A的别名的话,它两是等价的。
    但A, B仍是两种类型,它们的type对象是不同的。

    scala> import scala.reflect.runtime.universe.typeOf
    import scala.reflect.runtime.universe.typeOf

    scala> type S = String
    defined type alias S

    scala> typeOf[S] =:= typeOf[String]
    res0: Boolean = true

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注