博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
scala 与 java泛型数组
阅读量:7091 次
发布时间:2019-06-28

本文共 1446 字,大约阅读时间需要 4 分钟。

java 泛型数组初始化

public class GenericArray
{ private T[] arr; public GenericArray(){ arr = new T[10]; //编译错误 }}

使用这样的方式初始化java的数组会出错,因为java不支持泛型数组。按照我的理解,java 初始化数组时候,需要知道数组的确切类型,但是泛型是编译后擦除的。所以运行时,无法知道数组的确切类型。所以java不支持以 new T[] 方式初始化一个数组。

如果想进行初始化,可以通过这样的方式

T[] arr=(T[]) new Object[10];

scala的泛型数组

那么同样的场景,在scala中如何实现呢

class ScalaGenericArray[T]{  val arr: Array[T] = new Array[T](10)}object ScalaGenericArray{  def main(args: Array[String]): Unit = {    val arr = new ScalaGenericArray[String]  }}

看起来很自然,但是在运行时候会报错:

Error:(9, 23) cannot find class tag for element type T

val arr: Array[T] = new Array[T](10)

原因和java的一样,虚拟机中,泛型相关的类型信息会被擦除,所以无法将T解释成实际类型String

那么如何做呢,此处我们需要将类型的信息以一个参数的方式传进去

class ScalaGenericArray[T](implicit classTag:ClassTag[T] ){ //让编译器帮我们传入类型信息  val arr: Array[T] = new Array[T](10)}object ScalaGenericArray{  def main(args: Array[String]): Unit = {    val arr = new ScalaGenericArray[String]  }}
  1. 感觉这种方式有点类似于java为了获取一个泛型的信息,将类以参数的形式传入函数参数中
public 
T test(Class
clazz) { System.out.println(clazz); //...}
  1. 当然此处的ClassTag也可以使用Manifest,但是在scala 2.10.0后就不推荐使用了

  2. 这样写比较复杂,scala也提供另一种简单的方式,上下文界定

class ScalaGenericArray[T: ClassTag] {//此处不再需要提供参数  val arr: Array[T] = new Array[T](10)}object ScalaGenericArray {  def main(args: Array[String]): Unit = {    val arr = new ScalaGenericArray[String]  }}

这是scala的语法糖,T:ClassTag 告诉scala存在一个类型为ClassTag[T] 的隐式参数

转载地址:http://emiql.baihongyu.com/

你可能感兴趣的文章
W32TM注册time.windows.com作为权威时间同步源
查看>>
FreeBsdb FAMP Lamp环境
查看>>
vsphere5.1.vSphere_5.0简介. 第二第三部分视频共享
查看>>
Centos 5 配置nagios监控系统
查看>>
需求管理之如何撰写优秀的需求
查看>>
文本文件与二进制文件
查看>>
Linux 基础 - 磁盘管理 -04
查看>>
Sed 的使用方法
查看>>
RHEL6.3配置Apache服务器(1) 配置默认Web站点
查看>>
saltstack学习二:grains与pillar
查看>>
为什么应用程序用户启动时崩溃,使用xcode打开却不会
查看>>
开发第一个动态网站———使用Servlet
查看>>
通过自定义类加载器进行动态编译与动态实现接口
查看>>
ecmall后台拿Shell
查看>>
ISIS—BGP—VRRP 城域网典型架构图 拓扑实验
查看>>
浅谈oracle中row_number() over()分析函数用法
查看>>
jqGrid细节备注—jqGrid中获取subGrid的标题栏对象
查看>>
我给淘宝孙彤宇下的两个套和敬佩他的四个理由
查看>>
freemarker快速上手+空值的多种处理方法
查看>>
详解AJAX核心中的XMLHttpRequest对象
查看>>