scala 与 java泛型数组

简介: java 泛型数组初始化public class GenericArray { private T[] arr; public GenericArray(){ arr = new T[10]; //编译错误 }}使用这样的方式初始化java的数组会出错,因为java不支持泛型数组。

java 泛型数组初始化

public class GenericArray<T> {

    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> T test(Class<T> 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] 的隐式参数

目录
相关文章
|
2月前
|
存储 Java Scala
Scala 数组
Scala 数组
22 1
|
3月前
|
分布式计算 大数据 Java
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
47 1
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
|
3月前
|
存储 缓存 算法
Java 数组
【10月更文挑战第19天】Java 数组是一种非常实用的数据结构,它为我们提供了一种简单而有效的方式来存储和管理数据。通过合理地使用数组,我们能够提高程序的运行效率和代码的可读性。更加深入地了解和掌握 Java 数组的特性和应用,为我们的编程之旅增添更多的精彩。
39 4
|
3月前
|
Java API
[Java]泛型
本文详细介绍了Java泛型的相关概念和使用方法,包括类型判断、继承泛型类或实现泛型接口、泛型通配符、泛型方法、泛型上下边界、静态方法中使用泛型等内容。作者通过多个示例和测试代码,深入浅出地解释了泛型的原理和应用场景,帮助读者更好地理解和掌握Java泛型的使用技巧。文章还探讨了一些常见的疑惑和误区,如泛型擦除和基本数据类型数组的使用限制。最后,作者强调了泛型在实际开发中的重要性和应用价值。
60 0
[Java]泛型
|
3月前
|
存储 缓存 算法
提高 Java 数组性能的方法
【10月更文挑战第19天】深入探讨了提高 Java 数组性能的多种方法。通过合理运用这些策略,我们可以在处理数组时获得更好的性能表现,提升程序的运行效率。
45 2
|
3月前
|
存储 安全 Java
🌱Java零基础 - 泛型详解
【10月更文挑战第7天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
23 1
|
3月前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
104 2
|
3月前
|
Java 语音技术 容器
java数据结构泛型
java数据结构泛型
33 5
|
3月前
|
存储 Java 编译器
Java集合定义其泛型
Java集合定义其泛型
22 1
|
3月前
|
Java
Java数组动态扩容和动态缩减
Java数组动态扩容和动态缩减
30 3