最近在用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相关推荐

  1. c++ - Create empty json array with jsoncpp - Stack Overflow

    python中multiprocessing.pool函数介绍_正在拉磨_新浪博客 multiprocessing.pool c++ - Create empty json array with js ...

  2. docker-machine create -d generic 运行的波折过程及遇见的问题

    这是一个愚蠢的学习过程,但是因为觉得过程还是值得记录的,还是写了下来 2>driver = generic 1)在这个过程中使用的都是本地的mac系统,然后尝试在mac本地create -d g ...

  3. 容器编排技术 -- Kubernetes kubectl create secret generic 命令详解

    容器编排技术 -- Kubernetes kubectl create secret generic 命令详解 1 kubectl create secret generic 2 语法 3 示例 4  ...

  4. Generic Array Creation,泛型数组创建时提示出错

    起因 前两天在刷leetcode时,遇到一个设计题,需要设计一个哈希集合,当时的想法就是创建一个链表数组,用链表来解决哈希冲突问题. 然而在编写时,编译器报错,如下图所示. 分析 为什么会出现编译错误 ...

  5. 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 ...

  6. Java中创建泛型数组

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

  7. Java中? extends T和? super T的理解

    ? 通配符类型 - <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类; <? super T> 表示类型下界(Java Core中叫超类型限 ...

  8. java泛型学习三:受限制的通配符以及泛型方法

     一.受限制的通配符    package generic; import generic.windcard.Circle; import generic.windcard.Shape; import ...

  9. java泛型——桥方法

    [0]README 0.1)以下内容转自: http://www.cnblogs.com/ggjucheng/p/3352519.html [1]泛型约束和局限性-- 类型擦除所带来的麻烦 1.1)继 ...

最新文章

  1. 谷歌希望通过 Adiantum 为更多人提供加密功能
  2. 多表联合查询存储过程
  3. python标准库math用来计算平方根的函数_《Python程序设计方案》题库
  4. html答题赚钱源码,WTS在线答题系统 v1.0.0
  5. java商城_java网上商城系统怎么样?优势又有哪些?
  6. mysql 查询前一个月数据_mysql 查询当天、本周,本月,上一个月的数据......
  7. 基于FPGA实现ADS1675数据采集
  8. 结构型模式-装饰模式(扩展系统功能)
  9. 安卓恶意软件Skygofree爆发,连你的照片都能监控到
  10. dubbo负载均衡代码分析1(leastactive策略)
  11. [paper reading] DenseNet
  12. CSDN、博文视点名家讲坛之夏昕、林信良谈Spring框架
  13. 如何禁止某个程序修改计算机,电脑如何禁止某个程序运行?
  14. 程序员学习的网站(持续收集中)
  15. Redhat、Fedora、CentOS、OEL之间的关系与不同。
  16. 20172305 暑假作业 之 TimeCalculate Save Iron Man
  17. gamemaker studio socket例子
  18. GMS2(Gamemaker Studio 2)运行工程时遇到的问题解决
  19. java 高并发商城库存订单处理,下单减库存,如何解决高并发减库存问题
  20. AccessibilityService的学习,抢红包实现

热门文章

  1. Rancher PaaS平台简介
  2. Matplotlib 使用总结(画图线图、散点图、条形图、柱形图、3D图形等)
  3. 数据仓库系列之维度建模
  4. 上市即巅峰,新氧的洗脑广告还能看多久?
  5. 生死簿后台管理系统(有趣、放松下大脑)
  6. 修改Eclipse窗口颜色设置
  7. 世界上第一颗人造卫星——斯普特尼克1号
  8. 诗经 - 小雅 - 皇皇者华
  9. [USACO06NOV]玉米田Corn Fields题解
  10. 10个让设计简单干净的黄金法则