展开全部

大家都知道Vector以及其他的容器可以不加任何修饰地e68a8462616964757a686964616f31333236373765存储任何类型的对象,这给我们带来了极大的方便,也使得容器很容易被复用,但是大多数时候我们可能需要只能存储某一类型对象的Vector,这是因为我们不希望由于自己失误或其他原因在Vector中添加(add())了不同类型的对象而导致在程序中其它地方的get()发生运行时异常(这是由于不正确的类型转化引发的),请看下面的例子:

//:TestVector.javaimport java.util.Vector;class Dog{ private int number; public Dog(int number){ this.number = number; } public String toString(){ return "This is number #: " + number; }}public class TestVector { public static void main(String[] args) { Vector v = new Vector(); Dog dog; v.add(new Dog(1)); v.add(new Dog(2)); v.add(new Dog(3)); v.add(new Integer(4)); //假设由于我的疏忽,错误地将Integer类型的对象添加进了v中 for(int j = 0; j < v.size(); j++){ dog = (Dog)v.get(j); //想一想,当取到类型为Integer的对象时将引起ClassCastException System.out.println(dog); } }}

注意带有注释的那两行,这种错误在编译时并不会提醒我们,只能在运行时发生ClassCastException,这是(Dog)v.get(j)引起的,更糟糕的是当发生这种错误之后我们很难找到错误的根源在哪里,换句话说就是我们到底在哪里错误地添加了那个非Dog类型的Integer对象,大家运行程序就会明白。尤其是当我们在离那个错误的v.add(new Integer(4))很远的地方(可能是很多层)调用(Dog)v.get(i)时更是如此。此时大家可能会想,如果限制v仅能添加Dog类型的对象,问题不就解决了吗?这的确是个办法,解决如下:

//: DogVector.javaimport java.util.Vector;public class DogVector { private Vector v = new Vector(); public void add(Dog dog){ v.add(dog); } public Dog get(int index){ return (Dog)v.get(index); } public int size(){ return v.size(); }}//:TestDogVector.javapublic class TestDogVector { public static void main(String[] args) { Dog dog; DogVector dv = new DogVector(); //明确地创建了只能存放Dog对象的DogVector dv.add(new Dog(1)); dv.add(new Dog(2)); dv.add(new Dog(3)); // dv.add(new Integer(4)); //此时如果再发生这种疏忽的话,编译将不能通过 for(int i = 0; i < dv.size(); i++){ dog = dv.get(i); //此处也不需要向下转型为Dog System.out.println(dog); } }}

问题得到了解决,但此时大家可能郁闷了,我们在这种情况下是不是要写很多这样乏味的代码?每一类需要存储的对象都得写一个特定的集合类吗?确实在JDK1.5以前这的确是个问题,好在JDK1.5版本中sun引进了泛型--java参数化类型,到此,想必大家已经意识到参数类型化所要解决的问题之一,就像下面这样:

Vector v = new Vector(); E在此处代表我们指定v中只能存放E这种类型的对象,这样将确保我们不会错误地将别的类型的对象添加进去,如果你非要那样做错,编译器也不会允许,并且我们在使用get()方法的时候也不需要向下转型为对象本身的类型E,因为编译器已经为我们完成了,它很清楚地知道v中存储的对象类型就是E,而且get()返回的对象类型就是E而不光是Object。试试下面的例子:

//: TestVector2.javaimport java.util.Vector;public class TestVector2 { public static void main(String[] args) { Vector v = new Vector(); Dog dog; v.add(new Dog(1)); v.add(new Dog(2)); v.add(new Dog(3)); //v.add(new Integer(4)); //此时如果再发生这种疏忽的话,编译将不能通过 for (int j = 0; j < v.size(); j++) { dog = v.get(j); //此处也不需要向下转型为Dog,方法返回类型就是Dog System.out.println(dog); } }}

通过使用参数类型化,还会发生更多的微妙的变化,这里的v.get(j)返回为Dog型只是其中一例,在上例中v的其他一些方法的参数或返回值也将发生变化,有些接收Object参数的方法此时只能接受Dog或其派生类对象,如v.Set(int Index, Dog element),注意如果使用Dog及其派生以外的Object类型的对象做参数时将发生编译期错误,这也正是我们在这种情况下想要的效果,是不是很爽呢?

好了,罗嗦了这么多,其目的就是想让大家从问题的根源来理解概念,如果大家还想对其深入的话,可以找一些专门的资料来看看,想必学过C++的朋友应该对此很容易理解,因为java的参数化类型正是借鉴了C++中模板的概念。(如果你发现此贴中有不准确的地方,望及时指正,以免误人!谢谢!)

本回答由提问者推荐

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

java 中符号_谁能告诉我java中符号的用法,见代码相关推荐

  1. java属于高级语言_一文告诉你java是高级语言吗?

    很多刚接触java的朋友可能会疑惑,java是高级语言吗? 可以肯定的说,Java语言是高级语言.Java和C都是计算机的高级语言.相对低级语言来说,高级语言更接近人类的思维方式,更容易理解和掌握,用 ...

  2. 学python还是java贴吧_是学python还是java?一张图告诉你!

    物联网硬件开发 - 零基础学习电子产品设计 - 创客学院直播室​www.makeru.com.cn Java 和 Python 一直都是两种很火很强大的编程语言,对于刚开始起步学习编程的同学来说,会迷 ...

  3. java blob压缩_如何从Oracle中用Java压缩的BLOB列中提取XML文档

    我在Oracle 11G(11.1)中有一个表,它有一个包含XML文档的BLOB列. XML文档已使用Java程序写入表中,并已使用java.util.zip平减器进行序列化和压缩. 有没有简单的方法 ...

  4. 生活中java继承例子_简单继承例子:java

    通用类,来继承出圆和矩形. package circle; public class Geometric { private String color="white"; priva ...

  5. java applet 浏览器_浏览器不能加载Java中Applet小程序

    展开全部 要确e68a8462616964757a686964616f31333363373736保浏览器可以运行applet,需要执行如下步骤: 1.确保applet在eclipse是可以运行的(本 ...

  6. java fields是_一个快速生成R2.java中fields的插件

    一个快速生成R2.java中fields的插件 项目地址:github.com/JeasonWong/- 介绍 在子 module 中使用 ButterKnife 时,如果想使用 ButterKnif ...

  7. java lua脚本_请问该如何在Java中使用Lua脚本语言?

    如何在Java中使用Lua脚本语言是本文要介绍的内容,主要是来学习LUA脚本语言在JAVA中如何来使用,Lua就不说了, 现在比较热门, 语法也很简单. 为了在Java中调用, 折腾了比较长的时间, ...

  8. java 事件链_供应链攻击事件——针对Github中Java项目的定向攻击

    阅读: 1,446 前言 2020年5月28日,Github安全团队发表了文章称Github上存在一组代码仓库正在服务于感染了恶意代码的开源项目(https://securitylab.github. ...

  9. eclipse写java实现端口_使用eclipse(windows)在java中使用IPv6地址和端口号创建套接字...

    当我尝试使用IPv4地址创建套接字时,它很成功,但是当我尝试使用IPv6地址和端口号创建套接字时,它会引发异常: java.net.SocketException: Network is unreac ...

最新文章

  1. zabbix监控windows 服务器各项性能
  2. tomcat与iis公用80端口(已经发布.net项目现在开发Java项目时tomcat在eclipse中localhost:8080打不开问题)...
  3. java对象的状态,Java编程菜鸟课程:状态对象
  4. Docker学习笔记【一】
  5. HTTP 协议详解--转
  6. 嵌入式Linux之我行——ARM MMU工作原理剖析
  7. docker公共存储库_Docker实战001:简单的认识下docker
  8. 每天一道剑指offer-数值的整数次方
  9. 用计算机改手机电量,三分钟更换iPhone 6虚标电池,老手机又焕发青春了
  10. eclipse windowJAVA版64位安装教程
  11. 启天m7300微型计算机,启天M7300
  12. 医院信息化建设,产品规划要求​
  13. Win11无线网络适配器有感叹号不能上网怎么解决
  14. 凯思面试经历转置一个string
  15. C语言之打印错误信息
  16. Java基础23 网络编程 socket套接字流 TCP传输总结
  17. 微软office服务器连接很慢,解决 RPC 请求处理速度慢的问题
  18. 自动登陆qq空间代码
  19. 音视频开发:大华摄像头配置RTSP与RTMP地址访问视频画面
  20. Python编程基础-函数

热门文章

  1. 基于.net的微服务架构下的开发测试环境运维实践
  2. WEB API系列(一):WEB API的适用场景、第一个实例
  3. Chrome浏览器常见问题及解决方案集锦
  4. open ssl里面的自定义get***函数失效
  5. java 从数据库取值_java 连接数据库取值问题
  6. php的_auto,AutoPHPCheck下载
  7. java把对象转成json_java 把对象 对象转换成json字符串 | 学步园
  8. html的canvas标签用法,html5中关于canvas标签用法(绘图)
  9. 电子商务应用课程知识整理 第一章-电子商务概述与类型
  10. python实例化是什么意思_Python中实例化class的执行顺序示例详解