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

  • 时间:
  • 浏览:0
  • 来源:彩神大发11选5_神彩大发11选5官方

到此,Scala的类型系统基本介绍完毕,下表给出了Scala中常见的类型

顶端的typeOf[A]在传入参数为List(“String”)时,得到结果是java.lang.String。typeOf[A]接受有一另一个 类型为TypeTag[a]的隐式参数,编译器生成的TypeTag隐式参数会被传给typeOf[A] 。 有4种TypeTag:

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

@specialized 还还还要更细致,限定某个或几条基本类型,同类 :

1 类型擦除

假设没没办法 人利用Java泛型定义了下面的Person类:

1 scala.reflect.api.TypeTags#TypeTag. A full type descriptor of a Scala type. For example, a TypeTag[List[String]] contains all type information, in this case, of typescala.List[String].

2 scala.reflect.ClassTag. A partial type descriptor of a Scala type. For example, a ClassTag[List[String]] contains only the erased class type information, in this case, of type

3 scala.collection.immutable.List.ClassTags provide access only to the runtime class of a type. Analogous to scala.reflect.ClassManifest.

4 scala.reflect.api.TypeTags#WeakTypeTag. A type descriptor for abstract types (see corresponding subsection below).

还还要看到,Function1类也进行了类型专门化。

java中的类型擦除会引起许多问題,具体还还要参考http://blog.csdn.net/lonelyroamer/article/details/7868820

下面的代码给出了Manifest的用法:

作者:摆摆少年梦

视频地址:http://blog.csdn.net/wsscy30004/article/details/38440247

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

加进去去公众微信号,还还要了解更多最新Spark、Scala相关技术资讯

上述代码编译还要生成下列字代码文件,如下图

隐式参数m由编译器根据上下文自动传入,同类 print1(List(“one”, “two”)) ,编译器会根据”one”,”two” 实际类型推断出 T 的类型是 String,再隐式地传入了Manifest[String]类型的对象参数,使得运行时还还要根据你是什么参数做更多的事情。

自动装箱与拆箱还要损耗一定的性能,当性能要求较高时还要程序员手动云进行转换。Scala中的Type Specialization处里了有有哪些问題。它的语法很简单,通过注解进行类型专门化声明,如:

下面的代码演示了如何使用TypeTag

2 自动装箱与拆箱

肯能类型擦除的影响,编译期位于的类型信息在编译后不位于了,在程序时必须获取该信息,但许多场景下肯能还要得到编译期的类型信息,scala才能做到你是什么点,它通过Manifest和TypeTag来保存类型信息并在运行时使用该信息。那Manifest与TypeTag有有哪些区别呢?Manifest在scala.reflect包中,它在scala.reflect包中,而TypeTag 在scala.reflect.runtime.universe包中定义;TypeTag还还要用来替代Manifest,功能更强大许多,Manifest必须识别路径依赖类型,同类 对于class Outter{ class Inner},假设分别创建了有一另一个 不同的组织组织结构类,outter.Inner, outter2.Inner, Manifest就会识别为同一类型,而TypeTag无需,另外TypeTag还还要使用typeOf[T] 来检查类型参数。

经过类型擦除后的类称为原始类型,从这点来看,java中的泛型我我觉得是有一另一个 伪泛型,它只在编译层次进行实现,在生成字码码这次责泛型信息被擦除。下面的例子证明也证明了你是什么点:

Type Specialization,一般被翻译成类型专门化,它主也不我用来处里泛型的类型擦除和自动装箱拆箱的问題。在JAVA语言当中,泛型生成字节码文件还要进行泛型类型擦除,类型擦除后利用上界类型(一般是Object)来替代,但没办法 做励志的话 有问題,这是肯能在Java语言中基本类型与对象类型是必须相互引用的,java中的基本类型必须使用泛型。处里方案是利用对应的对象类型来进行替代,同类 int对应Integer类型,但你是什么法子未必能处里根本问題。为方便顶端Type Specialization的理解,没没办法 人先从java的类型擦除、自装箱与拆箱讲起。

在前面给的示例代码中,没没办法 人直接使用

Person<Integer> p2=new Person<Integer>(1, 23);

还要注意的是这里使用的是java的基本类型进行对象的创建,而给定的具体类型是Integer,此时Java会帮没没办法 人自动进行转换,你是什么转换操作被称为自动装箱(autoboxing),顶端的代码为宜 :Person<Integer> p2=new Person<Integer>(Integer.valueOf(1), Integer.valueOf(23));

从顶端的代码还还要看到,typeTag返回的是具体的类型,而还要类型擦除刚刚的类型any,即TypeTag保存所有具体的类型。在运行时还还要通过模式匹配来精确地对类型进行判断:

这给出最常用的ClassTag的用法:ClassTag[T]保存了被泛型擦除后的原始类型T,提供给运行时程序使用。

本节内容大多来源于自官方文档http://docs.scala-lang.org/overviews/reflection/typetags-manifests.html,没没办法 人在学习的刚刚,可看打开API文档,对本节内容进行理解。

在上一讲中没没办法 人看到了Function1及Function2的类定义中也使用@specialize进行注解,如:

从图中还还要看到,共生成了九个版本的List,其中这九个文件分别对应scala中的九种基本类型即Unit, Boolean, Byte, Short, Char, Int, Long, Float, Double。感兴趣的还还要利用javap命令进行查看,这里给出其Byte类型的实现:

下面的代码演示了拆箱(unboxing)