yii2数组转为对象_好程序员Java学习路线分享java为什么不支持泛型数组
本篇文章好程序员为大家一下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为什么不支持泛型数组相关推荐
- system.img解包打包工具_好程序员云计算学习路线分享文件打包及压缩
好程序员云计算学习路线分享文件打包及压缩 好程序员 建议针对目录 Demo: 复制未打包的文件到远程主机 [root@yangs ~]# du -sh /etc 39M /etc [root@yang ...
- bytes数组转string指定编码_好程序员Java学习路线分享Java基础之string
好程序员Java学习路线分享Java基础之string 好程序员Java培训 先来讲一下字符串 字串符分类: 不可变字符串:----String.字符串本身不能发生改变,与指向字符串的引用无关. St ...
- 好程序员Python学习路线分享Linux和数据库部分
好程序员Python学习路线分享Linux和数据库部分,技能树:掌握Linux操作系统管理技术,可以搭建几乎所有Linux环境服务器. 学习线路简单示意图: 知识点细化: Linux操作系统:常见操作 ...
- mount: 未知的文件系统类型“vboxsf”_好程序员云计算学习路线教程大纲课件:Mount 挂载详解...
好程序员云计算学习路线教程大纲课件:Mount 挂载详解: ====================================================================== ...
- java 中文乱码_好程序员Java学习路线分享如何处理中文参数
好程序员Java学习路线分享如何处理中文参数,为什么表单中会产生中文乱码. 好程序员Java培训 产生乱码,就是因为服务器和客户端沟通的编码不一致造成的,因此解决的办法是:在客户端和服务器之间设置一个 ...
- ajax不执行_好程序员Java学习路线分享原生Ajax的使用
好程序员Java学习路线分享原生Ajax的使用,首先我们先来看一下什么是 AJAX AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX 就是 异步.JavaScript ...
- app嵌入jsp页面的项目工作量_好程序员Java学习路线分享jsp为什么用的不多了
好程序员Java学习路线分享jsp为什么用的不多了,曾经JavaEE开发前端多数用的是JSP技术,因为在JSP出现之前,程序员基本都是在Servlet端直接通过out.print的方式拼接出一个页面返 ...
- 2019年Java程序员的学习路线
2019年Java程序员的学习路线 一.基础篇 面向对象 什么是面向对象 面向对象.面向过程 面向对象的三大基本特征和五大基本原则 平台无关性 Java如何实现的平台无关 JVM还支持哪些语言(Kot ...
- 好程序员Java学习路线分享finalize()方法详解
好程序员Java学习路线分享finalize()方法详解,前言,finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法.. fi ...
最新文章
- Label的作用是什么?是怎么用的?
- 论文笔记:ZFNet
- LwIP 之三 操作系统隔离接口 sys_arch
- 方舟服务器修改错误,方舟进服务器提示网络错误怎么办 | 手游网游页游攻略大全...
- c++primer第五版,p134页第2题自编程序
- 编写Tesseract的Python扩展
- ElasticSearch概述和定义
- centos7 安装VNC Server
- L1-028 判断素数 (10 分)—团体程序设计天梯赛
- 《Big Data Glossary》笔记
- struts2 s:file标签使用及文件上传例子
- 朋友圈我快看不下去了!
- redhat7 配置静态ip
- idcsystem源码php_最新PHP宝塔IDC分销系统源码
- 数字电路技术可能出现的简答题_数字电路复习题一简答题
- usbwriter使用后还原
- 语音共振峰的获取python
- 芝诺悖论:一个跑得最快的人永远追不上跑得最慢的人
- MySQL安装2出现Typical_Mysql安装 - osc_c7lpn2ge的个人空间 - OSCHINA - 中文开源技术交流社区...
- 软件需求、架构培训(一)
热门文章
- ACL 2020 | 用于多领域端到端任务型对话系统的动态融合网络
- 每周一起读 × 招募 | WWW 2019:基于层次化强化学习的多源搜索展示优化
- Face++ 论文解读:一种新的行人重识别度量学习方法 | PaperDaily #20
- 邮件excel html,小数点分隔符在电子邮件(HTML/CSS)在Excel的VBA编程
- Java实现单链表的逆序打印
- nginx配置ajax请求跨域
- PaddleLabel——重新识别失败【Can not recognise the detection box in 文件. Please change manually 】解决方案
- Task Schedule
- centos 查看版本
- 数学建模国赛 常考赛题类型(模拟退火算法、粒子群算法、遗传算法)