Scala入门到精通——第二十四节 高级类型 (三)

本文介绍了Scala中的高级类型概念,包括类型专门化(Type Specialization)以解决泛型类型擦除和自动装箱拆箱问题,以及Manifest、TypeTag和ClassTag在运行时保存类型信息的作用。文章详细讲解了类型专门化的语法和示例,并对比了Manifest和TypeTag的区别。最后,对Scala的类型系统进行了总结。
摘要由CSDN通过智能技术生成

作者:摆摆少年梦
视频地址:http://blog.csdn.net/wsscy2004/article/details/38440247

本节主要内容

  1. Type Specialization
  2. Manifest、TypeTag、ClassTag
  3. Scala类型系统总结

在scala中,类(class)与类型(type)是两个不一样的概念。我们知道类是对同一类型数据的抽象,而类型则更具体。比如定义class List[T] {}, 可以有List[Int] 和 List[String]等具体类型,称List为类,而List[Int]、List[String]则为类型。从这方面看:类型一致的对象它们的类也是一致的;而类一致的,其类型不一定一致。例如:

//List[Int]与List[String]它们的类是相同的即List
scala> classOf[List[Int]] == classOf[List[String]]
res1: Boolean = true

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._
//类相同,但它们的类型是不一样的
scala>  typeOf[List[Int]] == typeOf[List[String]]
res3: Boolean = false

1. Type Specialization

Type Specialization,一般被翻译成类型专门化,它主要是用来解决泛型的类型擦除和自动装箱拆箱的问题。在JAVA语言当中,泛型生成字节码文件时会进行泛型类型擦除,类型擦除后利用上界类型(一般是Object)来替代,但这么做的话有问题,这是因为在Java语言中基本类型与对象类型是不能相互引用的,java中的基本类型不能使用泛型。解决方案是利用对应的对象类型来进行替代,例如int对应Integer类型,但这种方式并不能解决根本问题。为方便后面Type Specialization的理解,我们先从java的类型擦除、自装箱与拆箱讲起。

1 类型擦除
假设我们利用Java泛型定义了下面的Person类:

//Java泛型类
public class Person<T> {
    private T firstName;
    private T secondName;
    public Person(T firstName,T secondName){
        this.firstName=firstName;
        this.secondName=secondName;
    }
    public T getFirstName() {
        return firstName;
    }
    public void setFirstName(T firstName) {
        this.firstName = firstName;
    }
    public T getSecondName() {
        return secondName;
    }
    public void setSecondName(T secondName) {
        this.secondName = secondName;
    }

}

经过类型擦除后,最终变为:

public
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值