Cannot create a generic array of ArrayListDog
最近在用Java写某个程序时希望写出一个包括ArrayList<xx>的数组
自己定义如下:
ArrayList<edge>[] edges = new ArrayList<edge>()[10];
然后编译器报错如下:
Cannot create a generic array of ArrayList<edge>;
在C++里可以这样比较方便的定义: vector<edge> a[100];
在Java里报错,查询了一下,见已经有人在stackoverflow上问了这个问题,链接如下:
http://stackoverflow.com/questions/4549192/create-an-array-of-arrayliststring-elements
上面的链接讲的多是解决(代替)方法,具体这样设计的原因还要自己继续深究。
一、出现这个问题的原因
正如IDE报错的信息所述:无法创建范型数组,底层的数组类型只能是Object的。
类型擦除:
简单来说,就是JVM将泛型存储的东西都视为Object,
即ArrayList<Integer>.class = ArrayList<String>.class = ArrayList<Object>.class
所以你如果定义了泛型数组,在使用的时候就很可能发生"猫插入狗列表"的事件
那我们接着探讨,为什么会引入类型擦除,<<Thinking in Java>>中介绍了这其中的历史原因,因为在JavaSE1.5之前是没有泛型的,
于是为了与之前版本类库的融合(不重写之前的类库),所以目前采用了类型擦除这种方法.
二、解决的方法
1、很简单,不用泛型。再额外定义一个class T, T里面包括一个ArrayList成员变量,借由T的public方法add向ArrayList里添加元素
2、方法一是对我这个程序的解决方法,对于Java泛型更通用的方法,class XX <T> { } 来说,
<<Thinking In Java>>上面讲了四种解决方案,具体如下:
http://blog.csdn.net/eric_sunah/article/details/7262486
没有任何方式可以推翻底层的数组类型,它只能是Object[]
所以作者讲的前三种方式涉及Object与其它类型之间的转型都可能会抛出异常或无法编译
所以应该采用上面链接所描述的第四种方法,将类型标记<T>传递到构造器中,以便从擦除中恢复
Cannot create a generic array of ArrayListDog相关推荐
- c++ - Create empty json array with jsoncpp - Stack Overflow
python中multiprocessing.pool函数介绍_正在拉磨_新浪博客 multiprocessing.pool c++ - Create empty json array with js ...
- docker-machine create -d generic 运行的波折过程及遇见的问题
这是一个愚蠢的学习过程,但是因为觉得过程还是值得记录的,还是写了下来 2>driver = generic 1)在这个过程中使用的都是本地的mac系统,然后尝试在mac本地create -d g ...
- 容器编排技术 -- Kubernetes kubectl create secret generic 命令详解
容器编排技术 -- Kubernetes kubectl create secret generic 命令详解 1 kubectl create secret generic 2 语法 3 示例 4 ...
- Generic Array Creation,泛型数组创建时提示出错
起因 前两天在刷leetcode时,遇到一个设计题,需要设计一个哈希集合,当时的想法就是创建一个链表数组,用链表来解决哈希冲突问题. 然而在编写时,编译器报错,如下图所示. 分析 为什么会出现编译错误 ...
- Java ArrayList的Array,Array的ArrayList
Today we will learn how to create a Java array of ArrayList. We will also learn how to create an Arr ...
- Java中创建泛型数组
Java中创建泛型数组 使用泛型时,我想很多人肯定尝试过如下的代码,去创建一个泛型数组 T[] array = new T[]; 当我们写出这样的代码时编译器会报Cannot create a gen ...
- Java中? extends T和? super T的理解
? 通配符类型 - <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类; <? super T> 表示类型下界(Java Core中叫超类型限 ...
- java泛型学习三:受限制的通配符以及泛型方法
一.受限制的通配符 package generic; import generic.windcard.Circle; import generic.windcard.Shape; import ...
- java泛型——桥方法
[0]README 0.1)以下内容转自: http://www.cnblogs.com/ggjucheng/p/3352519.html [1]泛型约束和局限性-- 类型擦除所带来的麻烦 1.1)继 ...
最新文章
- 谷歌希望通过 Adiantum 为更多人提供加密功能
- 多表联合查询存储过程
- python标准库math用来计算平方根的函数_《Python程序设计方案》题库
- html答题赚钱源码,WTS在线答题系统 v1.0.0
- java商城_java网上商城系统怎么样?优势又有哪些?
- mysql 查询前一个月数据_mysql 查询当天、本周,本月,上一个月的数据......
- 基于FPGA实现ADS1675数据采集
- 结构型模式-装饰模式(扩展系统功能)
- 安卓恶意软件Skygofree爆发,连你的照片都能监控到
- dubbo负载均衡代码分析1(leastactive策略)
- [paper reading] DenseNet
- CSDN、博文视点名家讲坛之夏昕、林信良谈Spring框架
- 如何禁止某个程序修改计算机,电脑如何禁止某个程序运行?
- 程序员学习的网站(持续收集中)
- Redhat、Fedora、CentOS、OEL之间的关系与不同。
- 20172305 暑假作业 之 TimeCalculate Save Iron Man
- gamemaker studio socket例子
- GMS2(Gamemaker Studio 2)运行工程时遇到的问题解决
- java 高并发商城库存订单处理,下单减库存,如何解决高并发减库存问题
- AccessibilityService的学习,抢红包实现