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