【scala类型系统】type关键字

1. type的作用

type是一种语法糖,class,trait,object会产生新的类型, 而type关键字用于对已有类型(或类型组合)提供别名

2. 复杂类型的抽象

将次要类型抽象为成员变量,方便判断对象是否为主要类型的投影

type T = Serializable{
    // 针对次要类型X,type在内部提供占位符
    type X
    def foo():Unit
}
object A extends Serializable{
    // 实例化时,将占位符指定为具体的类型,而不影响主要类型
    type X = String
    def foo(){}
}
typeOf[A.type] <:< typeOf[T] // true, 对象A的类型是类型T的投影,内部类型X是什么无关紧要

3. 作为成员变量使用

将参数类型抽象为成员变量,方便类型的统一管理

trait A{
    // 定义T为成员变量
    type T
    // 类型T作为参数类型使用,且只需要在实例化时指定具体的T即可
    def foo(i: T) = println(i)
}
// 本例中指定T为Int类型
// 在继承时指定T的具体类型
class B extends A {type T = Int}
val b = new B
b.foo(200)
// 在实例化时指定T的具体类型
class B extends A
val b = new B{type T = Int}
b.foo(200)

// 本例中指定T为String类型
// 在继承时指定T的具体类型
class C extends A {type T = String}
val c = new C
c.foo("hello")
// 在实例化时指定T的具体类型
class C extends A
val c = new C{type T = String}
c.foo("hello")

4. 与泛型的区别

如果使用泛型,则必需时刻保留泛型参数,直至指定具体类型为止

trait A[T]{
    def foo(i: T) = println(i)
}
// 本例中指定T为Int类型
// 继承时指定T的具体类型
class B extends A[Int]
val b = new B
b.foo(200)

// 若不指定具体类型,则继承时保留泛型参数T
class B[T] extends A[T]
// 在实例化时指定具体类型T为Int
val b = new B[Int]
b.foo(200)

// 本例中指定T为String类型
// 继承时指定T的具体类型为String
class C extends A[String]
val c = new C
c.foo("hello")
// 在实例化是指定具体类型T为String
class C[T] extends A[T]
val c = new C[String]
c.foo("hello")
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼摆摆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值