前段时间在上国外某教授的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. 听小鹏讲废话之OSI
  2. linux性能优化常用命令
  3. 微信公众开放平台开发05---jetty部署异常:rg.apache.jasper.JasperException: PWC6345: There is an error in invoking ja
  4. php jpeg不支持,php jpeg不支持怎么办
  5. JavaSE笔记(0)JavaSE学习路线
  6. 计算机实战项目、课程设计、毕业设计之[含论文+源码等]微信小程序校园论坛|商城|电商系统+后台管理系统|前后分离VUE[包运行
  7. Python爬虫之一:十几行代码下载王者荣耀所有皮肤
  8. 555定时器+74系列芯片搭建八路抢答器,30s倒计时,附Proteus仿真等
  9. 英伟达发布《永劫无间》最新显卡驱动更新,驱动人生升级教程
  10. 23、python对数据进行求和、方差、平均值等基本统计指标计算
  11. pandas, dataframe获取最后一行的三种方法
  12. 英语caement单词caement水泥
  13. I'm a pc - I'm a mac :FIT
  14. HM-SpringCloud微服务系列11.1【多级缓存的意义JVM进程缓存】
  15. [zz from newsmth]王大牛的Memory Model白话系列(1)
  16. android 使用FileProvider 兼容apk 在7.0版本无法安装
  17. SSM框架在线拍卖系统项目
  18. backlog参数理解
  19. netty案例,netty4.1中级拓展篇七《Netty请求响应同步通信》
  20. it试用评估_it试用期工作总结3篇

热门文章

  1. Java的redis控制台-Jedis
  2. 查询工商单位注册信息 平台
  3. MyBatis入门使用方式
  4. 字符串常量池(StringTable)总结
  5. 浅谈Mysql底层索引原理
  6. python使用逐行读取,出现空行,清楚空行方法
  7. Java Collection小结
  8. 王方月 - 《君王2》与cocos2d-x的邂逅
  9. linux 将文件打包、压缩并分割成制定大小
  10. JAVA代码查错试题集