作者:摆摆少年梦
视频地址:http://blog.csdn.net/wsscy2004/article/details/38440247
本节主要内容
- Type Specialization
- Manifest、TypeTag、ClassTag
- 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