Java中创建泛型数组
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中创建泛型数组相关推荐
- java 数组json_如何在Java中创建JSON数组
我有一个 JSON结构如下.如何以编程方式创建此Array结构? JSON结构: { "Employee": [ { "EmP325235": { " ...
- Java中创建数组的几种方法
Java中创建数组的几种方法 public static void main(String[] args) { //创建数组的第一种方法 int[] arr=new int[6]; int intVa ...
- 【笔记】JAVA中的泛型和反射
泛型 Java的泛型是如何工作的?什么是类型擦除? ----泛型是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息.例如List在运行时仅用一个Lis ...
- Java中的泛型全解析(二)
Java中的泛型全解析(一) 泛型中的约束和局限性 现在我们有泛型类 不能用基本类型实例化类型参数 运行时类型查询只适用于原始类型 泛型类的静态上下文中类型变量失效 不能在静态域或方法中引用类型变量. ...
- java在数组中放入随机数_如何在Java中随机播放数组
java在数组中放入随机数 There are two ways to shuffle an array in Java. 有两种方法可以在Java中随机播放数组. Collections.shuff ...
- Java 中的泛型是什么,它有什么作用?(十五)
Java中的泛型是一种类型参数化机制,它使代码更具可读性.可重用性和稳健性.在Java中,通过使用泛型,可以将类型作为参数传递给类或方法,并在编译时执行类型检查,从而避免许多运行时错误. 泛型的基础 ...
- 聊聊Java中的泛型
聊聊Java中的泛型 文章目录 聊聊Java中的泛型 参考资料 一.概述 1. 泛型的定义 1.1 定义 1.2 常见形式 2. 为什么需要泛型 3. 泛型的优点 4. 泛型的使用 4.1 泛型类 4 ...
- Java中的泛型与异常机制
Java中的泛型与异常机制 ※泛型的使用 如果在使用集合时没有限定集合所保存的数据类型,则在代码运行期间容易会出现ClassCastException类转换的异常 通过设置泛型,可以在编译期间发生问题 ...
- 如何在Java中创建一个新的List
本文翻译自:How to make a new List in Java We create a Set as: 我们创建一个Set为: Set myset = new HashSet() How d ...
最新文章
- OpenCV中的姿势估计及3D效果(3D坐标轴,3D立方体)绘制
- php报错Permission denied
- 【洛谷P1186】玛丽卡(断边+最短路)
- 算法 - pyhton - 二分查找
- JAVA中Map集合的使用举例
- arp 不同网段 相同vlan_三层交换机,相同的网段,不同的VLAN ,怎么通信?
- 360度旋转图片小特效
- mitmproxy抓包 | Python疑难测试场景mock实战(四)
- C++的使用Lambda
- (篇九)C语言统计某个字母的个数、统计各种字符的个数、统计单词的个数
- 化学实验中计算机技术的应用,数字化实验在化学教学中的应用
- 计算机软考高级论文怎么写,【干货】软考高级论文怎么写易得高分?
- jenkins插件镜像源
- 服务器的mdf文件怎么打开,mdf文件如何打开 mdf文件打开操作步骤
- Qt笔记(六十三)之Qt实现窗口以及控件的全屏效果
- 学计算机小学教师资格证,教师资格证我现在在一间小学教计算机,但现在 – 手机爱问...
- opencv28:分水岭算法的图像分割
- mac mysql 1055_Mysql 错误“1055”
- 自动控制原理7.7---离散系统的数字校正
- LCR TC1 测试仪
热门文章
- JSon数据查询---Jlinq
- Dojo QuickStart 快速入门教程 (1) Why Dojo
- python多进程_Python多进程实践
- 打印出两个set中差集_Java之两个Set集合的交集、差集和并集
- matlab怎么没有编辑器,在不打开编辑器窗口的情况下开始一个新的MATLAB会话
- egg extend ts_KPL官方给各战队排T次:大王DYG,AG是老2、TS仅K
- linux cp 目录不存在自动创建,关于linux:Linux技巧cp命令自动创建不存在的目录和只复制修改的文件...
- docker 删除容器_Docker使用命令和技巧
- 在java读字符串入文件_如何在java中将文件读入字符串?
- Python,OpenCV进行直方图反投影