今天因为需要封装一些类,使用了泛型创建数组,方法如下:

T[] container = new T[capacity];

然后编译器报错:

报错Type parameter 'T' cannot be instantiated directly,即类型参数“T”不能直接实例化。

原因就是Java的泛型是通过类型擦除(type erasure)来实现的。类型擦除简单来说Java在编译期间,所有的泛型信息都会被擦除掉。如在代码中定义的List<object>和List<String>等类型,在编译后都会变成List。JVM看到的只是List,而由泛型附加的类型信息对JVM来说是不可见的。

Java编译器会在编译时尽可能的发现可能出错的地方,但是仍然无法避免在运行时刻出现类型转换异常的情况。直接创建泛型数组不能通过编译,而转型对象数组通过编译但是不能在JVM运行。所以由于类型擦除的原因,Java是禁止直接创建泛型数组实例的

解决方法:使用一个泛型数组包装器,维护一个原始类型的数组,通过数组入口方法进行元素编译期的类型安全检测(对应返回值)和强制类型转换(对于运行时不重要),从而保证类型安全。

public class GenericArray<T> {private Object[] array;  //维护Object[]类型数组@SupperessWarning("unchecked")public GenericArray(int sz) {array = new Object[sz];}public void put(int index, T item) {array[index] = item;}public T get(int index) { return (T)array[index]; }//数组对象出口强转public T[] rep() { return (T[])array; } //运行时无论怎样都是Object[]类型 public static void main (String[] args){GenericArray<Integer> gai = new GenericArray<Integer>(10);// Integer[] ia = gai.rep(); //依旧ClassCastExceptionObject[] oa = gai.rep(); //只能返回对象数组类型为Object[]gai.put(0,11);System.out.println(gai.get(0)); // 11 ,出口成功转型}
}

如果有兴趣了解更多相关内容,欢迎来我的个人网站看看:瞳孔的个人空间

java泛型数组:Type parameter ‘T‘ cannot be instantiated directly相关推荐

  1. java泛型数组替代方案_Kotlin泛型Array T导致“不能将T用作具体类型参数 . 使用类代替“但List T不会...

    我有一个包含T和一些元数据的数组(或列表)的接口 . interface DataWithMetadata { val someMetadata: Int fun getData(): Array } ...

  2. java 泛型全解 - 绝对最详细

    背景 对于java的泛型我一直属于一知半解的,平常真心用的不多.直到阅读<Effect Java>,看到很多平常不了解的用法,才下定决心,需要系统的学习,并且记录下来. 1.泛型的概述: ...

  3. java泛型详解_Java泛型详解(透彻)

    定义 Java中的泛型在JavaSE5中引入. 所谓泛型,即参数化类型.就是说,类型是以参数的方式传入泛型类. 例如: ArrayList aaryList = new ArrayList(); 那么 ...

  4. Java泛型:类型擦除

    前情回顾 Java泛型:泛型类.泛型接口和泛型方法 类型擦除 代码片段一 1 2 3 4 5 6 7 Class c1 = new ArrayList<Integer>().getClas ...

  5. 3万字死磕Java泛型所有细节知识点,看这一篇就够了

    1 泛型 1.0 前言--为什么要死磕Java泛型 不知道阅读这篇文章的你是否曾跟我一样,在没有阅读<Java核心技术>前查阅了大量的Java泛型文章,但是在实际使用泛型的过程中,总是觉得 ...

  6. 全面总结Java泛型

    普通泛型 class Point< T>{  // 此处可以随便写标识符号,T是type的简称 private T var ; // var的类型由T指定,即:由外部指定 public T ...

  7. Java泛型Generics

    转载请标明出处: http://blog.csdn.net/wu_wxc/article/details/51493181 本文出自[吴孝城的CSDN博客] 泛型 泛型是JDK 5中引入的一个新特性 ...

  8. java arraylist枚举器遍历_Java基础(七)泛型数组列表ArrayList与枚举类Enum

    一.泛型数组列表ArrayList 1.在Java中,ArrayList类可以解决运行时动态更改数组的问题.ArrayList使用起来有点像数组,但是在添加或删除元素时,具有自动调节数组容量的功能,而 ...

  9. java枚举类型数组_Java基础(七)泛型数组列表ArrayList与枚举类Enum

    一.泛型数组列表ArrayList 1.在Java中,ArrayList类可以解决运行时动态更改数组的问题.ArrayList使用起来有点像数组,但是在添加或删除元素时,具有自动调节数组容量的功能,而 ...

最新文章

  1. 废弃电器电子产品回收:需要的不仅是补贴 !
  2. VMware HA与VMotion的部署与搭建
  3. LeetCode 2176. 统计数组中相等且可以被整除的数对
  4. python selenium 下载文件_Python Selenium —— 文件上传、下载,其实很简单
  5. 从零学ELK系列(三):Centos安装Docker(超详细图文教程)
  6. 用usecase获取需求的方法是否有缺陷,还有什么地方需要改进
  7. 学习Python编程培训 有哪些爬虫技术课程需要掌握
  8. HTML5本地存储与会话存储
  9. Android 属性动画(三)
  10. SAP中程序从服务器下载所对应的文件
  11. “坦克大战”小游戏(C语言)源代码及其详解注释
  12. 海康威视4200服务器显示资源不足,硬盘录像机提示“资源不足”是什么原因 -
  13. linux主机名hostname老是被更改为broad原理分析和恢复
  14. 17 线性方程组——线性方程组解的结构、解的性质、解空间、基础解系、基础解系存在性
  15. linux工作札记 - 查看发行版本命令
  16. CodeForces 379A. New Year Candles
  17. 网站被攻击了怎么办?
  18. c语言51单片机调节led亮度,51单片机中用PWM控制LED亮度调节
  19. WebView 入坑
  20. i9 12900k参数 i9 12900k核显相当于什么水平

热门文章

  1. 如何用计算机二进制进行计算,计算机如何实现二进制数据运算
  2. Oracle 实用技巧之不知道密码情况下 dblink 的迁移
  3. 谭的c语言,c语言 谭
  4. 采用Resnet做UC Merced Land Use Dataset数据分类
  5. 微信小程序之商用商城小程序
  6. Proteus8.9 VSM Studio WINAVR编译器仿真ATmega16系列a09_扩展内存
  7. 喜报!中国工商银行长春分行荣获吉林省“巾帼建功”先进集体称号
  8. 《塞尔达传说:旷野之息》中设计元素的分析
  9. python爬虫——实战篇
  10. Django+Vue开发生鲜电商平台之11.首页、商品数量、缓存和限速功能开发