为什么在java中不能创建泛型数组
前段时间在上国外某教授的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*/
}
在下面,书上又介绍了另一端比较长的例子。
//: 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中不能创建泛型数组相关推荐
- java中如何创建字符串数组
先说一下我踩过的两个坑 ① //String [] = new arr[]; //arr[]={"张三","张三丰","张无忌"," ...
- Java中创建泛型数组
Java中创建泛型数组 使用泛型时,我想很多人肯定尝试过如下的代码,去创建一个泛型数组 T[] array = new T[]; 当我们写出这样的代码时编译器会报Cannot create a gen ...
- yii2数组转为对象_好程序员Java学习路线分享java为什么不支持泛型数组
本篇文章好程序员为大家一下java为什么不支持泛型数组,希望对大家有所帮助. public class Pair { public void info( ) { System.out.println( ...
- 【性能优化】面试官:Java中的对象和数组都是在堆上分配的吗?
写在前面 从开始学习Java的时候,我们就接触了这样一种观点:Java中的对象是在堆上创建的,对象的引用是放在栈里的,那这个观点就真的是正确的吗?如果是正确的,那么,面试官为啥会问:"Jav ...
- Java中如何定义一个数组呢?
转自: Java中如何定义一个数组呢? 数组(Array)是有序的元素序列.若将有限个类型相同的变量的集合命名,那么这个名称为数组名.组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标 ...
- Java中List如何转数组呢?
转自: Java中List如何转数组呢? 下文笔者讲述java中List转数组的方法分享,如下所示: 实现思路:借助List的toArray方法即可将一个List转化为数组 List: 集合是Java ...
- java定义对象数组初始化_怎么定义对象数组 JAVA中怎么初始化对象数组?
java类怎样定义数组对象数组 在c++编程中,怎么定义对象数组的指针? JAVA中怎么初始化对象数组? java中怎么创建对象数组?比如我创建了一个学生类Sclass Student{ } 类中怎么 ...
- Java中的二维数组和递归
文章目录 二维数组 数组初始化以及匿名数组 数组拷贝 Java中数组作为参数传递 递归 二维数组 前面已经学习过数组了,了解到数组就是一种容器,用来存储同一类型值的集合,通过下标 / 索引可以访问数组 ...
- java中图片和字节数组相互转化
java中图片和字节数组相互转化 方案一:使用ImageIO来实现 将图片转化为字节数组 /*** 通过图片路径将图片文件转化为字符数组* * @param url 图片路径* @return byt ...
- Java中怎样创建数据库_在java中怎样创建MySQL数据库列表给个例子 爱问知识人
java中怎样创建MySQL数据库列表 需要使用jdbc访问数据库. 具体步骤如下: 1:加载驱动 ,返回连接 private static final String DRIVER_CLASS = & ...
最新文章
- 听小鹏讲废话之OSI
- linux性能优化常用命令
- 微信公众开放平台开发05---jetty部署异常:rg.apache.jasper.JasperException: PWC6345: There is an error in invoking ja
- php jpeg不支持,php jpeg不支持怎么办
- JavaSE笔记(0)JavaSE学习路线
- 计算机实战项目、课程设计、毕业设计之[含论文+源码等]微信小程序校园论坛|商城|电商系统+后台管理系统|前后分离VUE[包运行
- Python爬虫之一:十几行代码下载王者荣耀所有皮肤
- 555定时器+74系列芯片搭建八路抢答器,30s倒计时,附Proteus仿真等
- 英伟达发布《永劫无间》最新显卡驱动更新,驱动人生升级教程
- 23、python对数据进行求和、方差、平均值等基本统计指标计算
- pandas, dataframe获取最后一行的三种方法
- 英语caement单词caement水泥
- I'm a pc - I'm a mac :FIT
- HM-SpringCloud微服务系列11.1【多级缓存的意义JVM进程缓存】
- [zz from newsmth]王大牛的Memory Model白话系列(1)
- android 使用FileProvider 兼容apk 在7.0版本无法安装
- SSM框架在线拍卖系统项目
- backlog参数理解
- netty案例,netty4.1中级拓展篇七《Netty请求响应同步通信》
- it试用评估_it试用期工作总结3篇