本篇文章好程序员为大家一下java为什么不支持泛型数组,希望对大家有所帮助。

public class Pair {

public void info( )

{

System.out.println("I am Pair");

}

}

Pair[] p=new Pair[10];//该句编程环境会提示错误,连编译都不能通过

Java为什么使用泛型?

首先,从一个问题讲起——Java为什么使用泛型?引入泛型的目的之一就是为了提高程序的安全性,减少错误发生,还是用一段更形象的代码来讲吧。请看下面代码

public class Test {

public static void main(String[] args) {

ArrayList list=new ArrayList();

list.add(new Pair());

//list.add(5);

Pair p=(Pair)list.get(0);

p.info();

}

}

运行上面代码是不会有任何问题的,但是我们稍加改动,即放开被注释掉的那行代码,并将索引改为1,即变为如下代码

public class Test {

public static void main(String[] args) {

ArrayList list=new ArrayList();

list.add(new Pair());

list.add(5);

Pair p=(Pair)list.get(1);

p.info();

}

}

程序将发生java.lang.ClassCastException,很显然,是因为我们把int类型强制转为Pair类型发生的。以上代码是用引入泛型代码之前的方式写的,在引入泛型后,java集合都已经重写以迎合泛型。引入泛型的目的之一就是为了消除这种隐患,于是,泛型的一个原则被引了出来——如果一段代码在编译时没有提出“未经检查的转换”警告,则程序在运行时不会引发ClasscastException异常。

我们再用泛型的方式来重写一遍上面的代码,如下

编译环境会提示错误,编译都通不过,于是这便在编译阶段就避免了这种隐患的发生。泛型能够保证类型的统一。

为什么不能创建泛型数组?

这跟数组的一个特点有关,看代码

public class Father {

}

public class Son extends Father{

}

public class Test {

public static void main(String[] args) {

Father[] son=new Son[10];

}

}

数组是允许把一个子类数组赋给一个父类数组变量的!这会发生什么!?

public class Test {

public static void main(String[] args) {

Pair[] p = new Pair[10];//实际这句是不能通过编译的,会提示错误

Object[] oj = p;

}

}

如果允许创建泛型数组,将能在数组p里存放任何类的对象,并且能够通过编译,因为在编译阶段p被认为是一个Object[ ],也就是p里面可以放一个int,也可以放一个Pair,当我们取出里面的int,并强制转换为Pair,调用它的info()时会怎样?

java.lang.ClassCastException!这就违反了泛型引入的原则。所以,Java不允许创建泛型数组。

有人可能会说,即使我用泛型ArrayList list=new ArrayList( ),我不是照样可以取出里面的对象,使用显式的强制类型转换吗?比如,Father f=(Father)list.get(0),实际操作你将会发现,你依旧会被提示错误,编译不过,这并不违背泛型引入的原则。

yii2数组转为对象_好程序员Java学习路线分享java为什么不支持泛型数组相关推荐

  1. system.img解包打包工具_好程序员云计算学习路线分享文件打包及压缩

    好程序员云计算学习路线分享文件打包及压缩 好程序员 建议针对目录 Demo: 复制未打包的文件到远程主机 [root@yangs ~]# du -sh /etc 39M /etc [root@yang ...

  2. bytes数组转string指定编码_好程序员Java学习路线分享Java基础之string

    好程序员Java学习路线分享Java基础之string 好程序员Java培训 先来讲一下字符串 字串符分类: 不可变字符串:----String.字符串本身不能发生改变,与指向字符串的引用无关. St ...

  3. 好程序员Python学习路线分享Linux和数据库部分

    好程序员Python学习路线分享Linux和数据库部分,技能树:掌握Linux操作系统管理技术,可以搭建几乎所有Linux环境服务器. 学习线路简单示意图: 知识点细化: Linux操作系统:常见操作 ...

  4. mount: 未知的文件系统类型“vboxsf”_好程序员云计算学习路线教程大纲课件:Mount 挂载详解...

    好程序员云计算学习路线教程大纲课件:Mount 挂载详解: ====================================================================== ...

  5. java 中文乱码_好程序员Java学习路线分享如何处理中文参数

    好程序员Java学习路线分享如何处理中文参数,为什么表单中会产生中文乱码. 好程序员Java培训 产生乱码,就是因为服务器和客户端沟通的编码不一致造成的,因此解决的办法是:在客户端和服务器之间设置一个 ...

  6. ajax不执行_好程序员Java学习路线分享原生Ajax的使用

    好程序员Java学习路线分享原生Ajax的使用,首先我们先来看一下什么是 AJAX AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX 就是 异步.JavaScript ...

  7. app嵌入jsp页面的项目工作量_好程序员Java学习路线分享jsp为什么用的不多了

    好程序员Java学习路线分享jsp为什么用的不多了,曾经JavaEE开发前端多数用的是JSP技术,因为在JSP出现之前,程序员基本都是在Servlet端直接通过out.print的方式拼接出一个页面返 ...

  8. 2019年Java程序员的学习路线

    2019年Java程序员的学习路线 一.基础篇 面向对象 什么是面向对象 面向对象.面向过程 面向对象的三大基本特征和五大基本原则 平台无关性 Java如何实现的平台无关 JVM还支持哪些语言(Kot ...

  9. 好程序员Java学习路线分享finalize()方法详解

    好程序员Java学习路线分享finalize()方法详解,前言,finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法.. fi ...

最新文章

  1. Label的作用是什么?是怎么用的?
  2. 论文笔记:ZFNet
  3. LwIP 之三 操作系统隔离接口 sys_arch
  4. 方舟服务器修改错误,方舟进服务器提示网络错误怎么办 | 手游网游页游攻略大全...
  5. c++primer第五版,p134页第2题自编程序
  6. 编写Tesseract的Python扩展
  7. ElasticSearch概述和定义
  8. centos7 安装VNC Server
  9. L1-028 判断素数 (10 分)—团体程序设计天梯赛
  10. 《Big Data Glossary》笔记
  11. struts2 s:file标签使用及文件上传例子
  12. 朋友圈我快看不下去了!
  13. redhat7 配置静态ip
  14. idcsystem源码php_最新PHP宝塔IDC分销系统源码
  15. 数字电路技术可能出现的简答题_数字电路复习题一简答题
  16. usbwriter使用后还原
  17. 语音共振峰的获取python
  18. 芝诺悖论:一个跑得最快的人永远追不上跑得最慢的人
  19. MySQL安装2出现Typical_Mysql安装 - osc_c7lpn2ge的个人空间 - OSCHINA - 中文开源技术交流社区...
  20. 软件需求、架构培训(一)

热门文章

  1. ACL 2020 | 用于多领域端到端任务型对话系统的动态融合网络
  2. 每周一起读 × 招募 | WWW 2019:基于层次化强化学习的多源搜索展示优化
  3. Face++ 论文解读:一种新的行人重识别度量学习方法 | PaperDaily #20
  4. 邮件excel html,小数点分隔符在电子邮件(HTML/CSS)在Excel的VBA编程
  5. Java实现单链表的逆序打印
  6. nginx配置ajax请求跨域
  7. PaddleLabel——重新识别失败【Can not recognise the detection box in 文件. Please change manually 】解决方案
  8. Task Schedule
  9. centos 查看版本
  10. 数学建模国赛 常考赛题类型(模拟退火算法、粒子群算法、遗传算法)