前段时间在上国外某教授的algorithm课程,提到在java中不能创建泛型数组,课后也有这个思考题,自己百思不得其解,于是翻开了《think in java》这本书,在书的第15章,写到。这是由于擦除机制。(尽管通读了第15章,小白作者还是有很多地方不明白,如果读者能明白,望不吝赐教)

public class ErasedTypeEquicalence {public static void main (Sring args[]){Class c1=new Arraylist().getClass();Class c2=new Arraylist().getClass();System.out.println(c1==c2);}/*ourput:*true*/
}
在这个小代码中我们看到结果也许有有点迷糊,为什么返回的true,其实arraylist<String>和arraylist<Integer>很容易被认为是不同的类型,不同的类型在行为方面肯定不同。然而上面的程序认为他们是相同的类型。

在下面,书上又介绍了另一端比较长的例子。

//: generics/LostInformation.java
import java.util.*;class Frob {}
class Fnorkle {}
class Quark {}
class Particle{}public class LostInformation {public static void main(String[] args) {Listlist = new ArrayList();Mapmap = new HashMap(); Quarkquark = new Quark(); Particlep = new Particle(); System.out.println(Arrays.toString( list.getClass().getTypeParameters())); System.out.println(Arrays.toString( map.getClass().getTypeParameters())); System.out.println(Arrays.toString( quark.getClass().getTypeParameters())); System.out.println(Arrays.toString( p.getClass().getTypeParameters())); } } /* Output: [E] [K, V] [Q] [POSITION, MOMENTUM] *///:~ 

Class.getTypeParemeters() 将 "返回一个TypeVarivable的对象数组表示有泛型声明所声明的类型参数",好像暗示我们可能发现参数类型的信息,但是从输出我们可以看到,能够发现的只是用作参数占位符的标识符,这,并没有什么卵用。

书上提到了:这是一个残酷的现实:在泛型代码内部,无法获得任何有关泛型参数类型的信息。

泛型是通过擦除实现的,这意味着当你使用泛型时,任何具体的类型信息都被擦除了,你唯一所知道的就是你在使用一个对象。之前说的arraylist<String>和arraylist<Integer>在运行时会被擦除成“原生”的类型,即list。

书上提到了 泛型不是java语言出现就有的组成成分,所以为了减少擦除的混淆,我们要意识到,擦除是java语言实现泛型的一种折中,这种折中会让我们痛苦。。由于擦除的存在,泛型在java中的使用不像它原来设想的那么有用,尽管还是存在用处。

擦除的核心动机是它使得泛化的客户端可以用非泛化的类库,反之亦然,这经常被称为“迁移兼容性”。

擦除的代价是显著的,泛型不能用于显式地引用运行时类型的操作之中,例如转型、instanceof操作和new表达式。因为所有关于参数的类型信息都已经丢失了。

因此像  public class Eraesd<T>{

....

T [] arrary =new T[size]     ;//这样的代码会出现error  (won't compile)

...

}

为什么在java中不能创建泛型数组相关推荐

  1. java中如何创建字符串数组

    先说一下我踩过的两个坑 ① //String [] = new arr[]; //arr[]={"张三","张三丰","张无忌"," ...

  2. Java中创建泛型数组

    Java中创建泛型数组 使用泛型时,我想很多人肯定尝试过如下的代码,去创建一个泛型数组 T[] array = new T[]; 当我们写出这样的代码时编译器会报Cannot create a gen ...

  3. yii2数组转为对象_好程序员Java学习路线分享java为什么不支持泛型数组

    本篇文章好程序员为大家一下java为什么不支持泛型数组,希望对大家有所帮助. public class Pair { public void info( ) { System.out.println( ...

  4. 【性能优化】面试官:Java中的对象和数组都是在堆上分配的吗?

    写在前面 从开始学习Java的时候,我们就接触了这样一种观点:Java中的对象是在堆上创建的,对象的引用是放在栈里的,那这个观点就真的是正确的吗?如果是正确的,那么,面试官为啥会问:"Jav ...

  5. Java中如何定义一个数组呢?

    转自: Java中如何定义一个数组呢? 数组(Array)是有序的元素序列.若将有限个类型相同的变量的集合命名,那么这个名称为数组名.组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标 ...

  6. Java中List如何转数组呢?

    转自: Java中List如何转数组呢? 下文笔者讲述java中List转数组的方法分享,如下所示: 实现思路:借助List的toArray方法即可将一个List转化为数组 List: 集合是Java ...

  7. java定义对象数组初始化_怎么定义对象数组 JAVA中怎么初始化对象数组?

    java类怎样定义数组对象数组 在c++编程中,怎么定义对象数组的指针? JAVA中怎么初始化对象数组? java中怎么创建对象数组?比如我创建了一个学生类Sclass Student{ } 类中怎么 ...

  8. Java中的二维数组和递归

    文章目录 二维数组 数组初始化以及匿名数组 数组拷贝 Java中数组作为参数传递 递归 二维数组 前面已经学习过数组了,了解到数组就是一种容器,用来存储同一类型值的集合,通过下标 / 索引可以访问数组 ...

  9. java中图片和字节数组相互转化

    java中图片和字节数组相互转化 方案一:使用ImageIO来实现 将图片转化为字节数组 /*** 通过图片路径将图片文件转化为字符数组* * @param url 图片路径* @return byt ...

  10. Java中怎样创建数据库_在java中怎样创建MySQL数据库列表给个例子 爱问知识人

    java中怎样创建MySQL数据库列表 需要使用jdbc访问数据库. 具体步骤如下: 1:加载驱动 ,返回连接 private static final String DRIVER_CLASS = & ...

最新文章

  1. 鸿蒙可以和安卓抗衡吗,鸿蒙手机系统正式登场!继承EMUI的衣钵,能抗衡安卓系统吗?...
  2. postergresql mysql_PosttgreSQL快速入门:PostgreSQL的安装和配置
  3. 软工实践第三次作业(结对第一次作业)
  4. 【控制】《多智能体系统一致性协同演化控制理论与技术》纪良浩老师-第11章-连续时间多智能体系统牵制一致性
  5. 2015-03-17 how is task transaction type retrieved
  6. 3 年 Java 应该具备的技能体系
  7. OpenCV修养(三)——图像处理(上)
  8. jQuery 插件开发指南
  9. java查询出来的日期类型_Java的第29天,Oracle函数
  10. 世纪互联蓝云柯文达:与更多海外云服务商共赢中国市场
  11. 百度如何使用Go语言重构日请求量千亿级别的系统?
  12. DSSM模型的原理简介,预测两个句子的语义相似度
  13. 使用verilog实现4选1数据选择器的几种方法
  14. Java证件照剪切_GitHub - cacacai/idPicCut: 对原始证件照进行压缩,剪裁,换背景,(美颜)...
  15. 学机器学习怎么可以不知道最小二乘法
  16. 关于粮食浪费问题的调查报告
  17. JAVA程序员必看的15本书-JAVA自学书籍推荐(转)
  18. Android框架之ButterKnife(黄油刀)
  19. 【ESP 保姆级教程 预告】疯狂Node.js服务器篇 ——案例:ESP8266 + DS18B20温度传感器 +NodeJs本地服务+ MySQL数据库
  20. 常见的中间件有哪些?

热门文章

  1. java中HashSet实现(转)
  2. 2014-06-30nbsp;19:55
  3. error: failed to attach to process ID 0问题解决
  4. 如果Service有多个实现类,Spring怎么知道该注入哪个实现类
  5. 中国·哈尔滨国际友好城市冰雪汽车挑战赛开赛
  6. D-Bus 性能分析
  7. idea本地运行JavaWeb项目
  8. 对语音通话占用带宽的理解
  9. unique path 阶梯
  10. 天猫手机一战成名? 塑造品牌 完胜京东