当前位置: 首页 > news >正文

Java中创建泛型数组

Java中创建泛型数组

https://www.cnblogs.com/minghaiJ/p/11259318.html

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;
    }
    @Override
    public String toString() {
        return "Person [id=" + id + "]";
    }
}

测试结果
Snipaste_2019-07-28_15-50-48.jpg

例子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,以便从擦除中恢复,使得我们可以创建实际类型的数组。
第二种方法也简介实现了泛型数组,但我们不能通过方法直接返回数组,当我们在在吗中加入方法返回数组的方法时,编译器会报警告:
Snipaste_2019-07-28_17-59-59.jpg
当我们执行程序时,结果如下:
Snipaste_2019-07-28_18-03-07.jpg
由于泛型的擦除,不能将Object[]数组转型为具体类型的数组。

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

分类: java基础

 

 

 

 

 

 

 

 

相关文章:

  • java创建泛型数组
  • Android Studio 代码格式化自动换行问题(强迫症)
  • wwise eventid soundbank
  • 简便快捷:如何在Wwise中管理您的SoundBanks
  • Unity项目接入Wwise
  • 资源几点想法
  • 【Unity3D Editor】导入图片自动转换成Sprite
  • Unity5.x版本项目中删除Library目录后重新打包AssetBundle时,MD5会莫名其妙的变化,何解?
  • unity assetBundle更新 打包变化
  • Unity 打包AssetBundle文件的MD5值变化问题
  • Unity3D资源管理——Unity2017 Assetbundle依赖打包
  • AssetBundle粒度与分配策略剖析
  • Unity Prerfab 环形依赖
  • Unity3D研究院之查找资源被哪里引用了
  • Unity VS 暂挂程序
  • exif信息对照
  • Laravel5.4 Queues队列学习
  • mysql_config not found
  • October CMS - 快速入门 9 Images And Galleries
  • SpringBoot 实战 (三) | 配置文件详解
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 阿里云购买磁盘后挂载
  • 测试开发系类之接口自动化测试
  • 技术:超级实用的电脑小技巧
  • 前端面试题总结
  • 如何优雅地使用 Sublime Text
  • 我从编程教室毕业
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • (java)关于Thread的挂起和恢复
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (九)c52学习之旅-定时器
  • (十八)SpringBoot之发送QQ邮件
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)Scala的“=”符号简介
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .“空心村”成因分析及解决对策122344
  • .net 反编译_.net反编译的相关问题
  • .net生成的类,跨工程调用显示注释
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @AliasFor注解
  • @EnableWebMvc介绍和使用详细demo
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn
  • [BZOJ3223]文艺平衡树
  • [Go WebSocket] 多房间的聊天室(五)用多个小锁代替大锁,提高效率
  • [IE编程] WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口
  • [IE技巧] IE 中打开Office文件的设置
  • [JavaEE系列] wait(等待) 和 notify(唤醒)
  • [Linux_IMX6ULL应用开发]-Makefile
  • [MYSQL]mysql将两个表结果合并到一起