Java中创建泛型数组

使用泛型时,我想很多人肯定尝试过如下的代码,去创建一个泛型数组

T[] array = new T[];

当我们写出这样的代码时编译器会报Cannot create a generic array of T,初学泛型时,看到这个错就以为Java中不能创建泛型数组,随着不断的深入,当看到Tinking in Java中的泛型时,Java中是可以创建泛型的,真的是无知限制了自己的想象。

Java中创建泛型的例子:

例子1:

创建泛型数组的关键类

import java.lang.reflect.Array;class GenericsArray {@SuppressWarnings({ "unchecked", "hiding" })public static <T>  T[] getArray(Class<T> componentType,int length) {return (T[]) Array.newInstance(componentType, length);}
}

测试类

import java.util.Arrays;public class TestGenericArray {public static void main(String[] args) {@SuppressWarnings("static-access")Person[] persons = new GenericsArray().getArray(Person.class, 10);System.out.println(Arrays.toString(persons));for (int i = 0; i < persons.length; i++) {persons[i]=new Person(i);}System.out.println(Arrays.toString(persons));}
}

Person类

public class Person {private int id;public Person(int id) {this.id = id;}@Overridepublic String toString() {return "Person [id=" + id + "]";}
}

测试结果

例子2

相对于第一个例子简单的多,直接创建一个Object类型的数组,在类的内部数组的类型为Object类型的,但当取元素时转型为具体的类型。(泛型在类中由于擦除,其起作用的地方为,对传递进来的值进行额外的编译器检查,并插入对传递出去的值的转型)。

public class GenericsArray<T> {private Object[] array;public GenericsArray(int size){array = new Object[size];}public void put(int index, T item) {array[index] = item;}@SuppressWarnings("unchecked")public T get(int index) {return (T)array[index];}
}

总结

第一种方法是直接返回了一个泛型的数组,虽然有泛型的擦除,但在构造器中传递了类型标记Class,以便从擦除中恢复,使得我们可以创建实际类型的数组。
第二种方法也简介实现了泛型数组,但我们不能通过方法直接返回数组,当我们在在吗中加入方法返回数组的方法时,编译器会报警告:

当我们执行程序时,结果如下:

由于泛型的擦除,不能将Object[]数组转型为具体类型的数组。

我们知道知道ArrayList的底层也是数组实现的,而Java 1.5之后的ArrayList是支持泛型的,因而我们顺便来看看它的底层使用哪种方式实现的:如下

转载于:https://www.cnblogs.com/minghaiJ/p/11259318.html

Java中创建泛型数组相关推荐

  1. java 数组json_如何在Java中创建JSON数组

    我有一个 JSON结构如下.如何以编程方式创建此Array结构? JSON结构: { "Employee": [ { "EmP325235": { " ...

  2. Java中创建数组的几种方法

    Java中创建数组的几种方法 public static void main(String[] args) { //创建数组的第一种方法 int[] arr=new int[6]; int intVa ...

  3. 【笔记】JAVA中的泛型和反射

    泛型 Java的泛型是如何工作的?什么是类型擦除? ----泛型是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息.例如List在运行时仅用一个Lis ...

  4. Java中的泛型全解析(二)

    Java中的泛型全解析(一) 泛型中的约束和局限性 现在我们有泛型类 不能用基本类型实例化类型参数 运行时类型查询只适用于原始类型 泛型类的静态上下文中类型变量失效 不能在静态域或方法中引用类型变量. ...

  5. java在数组中放入随机数_如何在Java中随机播放数组

    java在数组中放入随机数 There are two ways to shuffle an array in Java. 有两种方法可以在Java中随机播放数组. Collections.shuff ...

  6. Java 中的泛型是什么,它有什么作用?(十五)

    Java中的泛型是一种类型参数化机制,它使代码更具可读性.可重用性和稳健性.在Java中,通过使用泛型,可以将类型作为参数传递给类或方法,并在编译时执行类型检查,从而避免许多运行时错误. 泛型的基础 ...

  7. 聊聊Java中的泛型

    聊聊Java中的泛型 文章目录 聊聊Java中的泛型 参考资料 一.概述 1. 泛型的定义 1.1 定义 1.2 常见形式 2. 为什么需要泛型 3. 泛型的优点 4. 泛型的使用 4.1 泛型类 4 ...

  8. Java中的泛型与异常机制

    Java中的泛型与异常机制 ※泛型的使用 如果在使用集合时没有限定集合所保存的数据类型,则在代码运行期间容易会出现ClassCastException类转换的异常 通过设置泛型,可以在编译期间发生问题 ...

  9. 如何在Java中创建一个新的List

    本文翻译自:How to make a new List in Java We create a Set as: 我们创建一个Set为: Set myset = new HashSet() How d ...

最新文章

  1. OpenCV中的姿势估计及3D效果(3D坐标轴,3D立方体)绘制
  2. php报错Permission denied
  3. 【洛谷P1186】玛丽卡(断边+最短路)
  4. 算法 - pyhton - 二分查找
  5. JAVA中Map集合的使用举例
  6. arp 不同网段 相同vlan_三层交换机,相同的网段,不同的VLAN ,怎么通信?
  7. 360度旋转图片小特效
  8. mitmproxy抓包 | Python疑难测试场景mock实战(四)
  9. C++的使用Lambda
  10. (篇九)C语言统计某个字母的个数、统计各种字符的个数、统计单词的个数
  11. 化学实验中计算机技术的应用,数字化实验在化学教学中的应用
  12. 计算机软考高级论文怎么写,【干货】软考高级论文怎么写易得高分?
  13. jenkins插件镜像源
  14. 服务器的mdf文件怎么打开,mdf文件如何打开 mdf文件打开操作步骤
  15. Qt笔记(六十三)之Qt实现窗口以及控件的全屏效果
  16. 学计算机小学教师资格证,教师资格证我现在在一间小学教计算机,但现在 – 手机爱问...
  17. opencv28:分水岭算法的图像分割
  18. mac mysql 1055_Mysql 错误“1055”
  19. 自动控制原理7.7---离散系统的数字校正
  20. LCR TC1 测试仪

热门文章

  1. JSon数据查询---Jlinq
  2. Dojo QuickStart 快速入门教程 (1) Why Dojo
  3. python多进程_Python多进程实践
  4. 打印出两个set中差集_Java之两个Set集合的交集、差集和并集
  5. matlab怎么没有编辑器,在不打开编辑器窗口的情况下开始一个新的MATLAB会话
  6. egg extend ts_KPL官方给各战队排T次:大王DYG,AG是老2、TS仅K
  7. linux cp 目录不存在自动创建,关于linux:Linux技巧cp命令自动创建不存在的目录和只复制修改的文件...
  8. docker 删除容器_Docker使用命令和技巧
  9. 在java读字符串入文件_如何在java中将文件读入字符串?
  10. Python,OpenCV进行直方图反投影