`
huobengluantiao8
  • 浏览: 1031431 次
文章分类
社区版块
存档分类
最新评论

Java集合中的泛型与多态问题

 
阅读更多

Java集合中泛型指的是在创建集合的时候要同时指定集合中存放的对象类型,这样做主要是基于类型安全方面的考虑。

比如假设我们要创建一个用于存放字符串的ArrayList,我们通常使用如下的方式:


注意尖括号及其里面的内容,这样我们的这个list中就只能存放String类型的对象,当我们试图向这个list中添加非String类型的对象(引用)的时候,会编译不通过,提示“找不到符号”(我觉得提示“找不到方法”更准确)。原因就是我们已经声明ArrayList中存放的String类型,当我们向这个ArrayList中添加对象(引用)的时候,编译器就会检查你存放的是否是String类型,如果不是,便会编译不通过,这就是所谓的类型安全问题。

在数组中存放对象(引用)的时候,编译器也会进行检查,当添加其他类型的对象的时候,编译不会通过,提示“不兼容的类型”。

上面介绍的是集合中的泛型问题,下面看一下集合中的多态问题,这才是本文的核心所在。

我们知道Java中的多态指的是:在程序中定义的某个引用变量具体所指向的类型和调用的方法在编码时并不能确定,而只有在运行的时候才能确定。简单来说就是这样的情况:你定义的引用变量是父类型,而你创建的对象是子类型,用这个父类型的引用变量指向这个子类型的对象,然后当你调用这个对象的方法的时候,具体是调用的父类的还是子类的方法只有在运行的时候才能确定,可能调用的是父类的方法也有可能调用的子类的方法,这样不用修改代码,就可以让成徐选择多个运行的状态,这就是多态。(关于多态,不明白的去查书。)

关于多态,简单理解就是适合父类的,必定也适合子类,即父类存在的地方也可以用子类来替换(而这其实对应一种设计原则,你也知道是吧,对,就是里氏替换原则。这里不介绍这个原则哈,只是顺便提一下。)

基于此,我们考虑集合中多态的情况。

先假设有一个方法如下(Animal为某类,Dog是其一个子类):


根据多态,我们知道我们可以用子类替换父类,而DogAnimal的子类即我们可以用一个Dog类型的对象作为该方法的参数,这没问题吧。是没问题的,我们继续。

我们引入集合及泛型,假设有某方法如下:


则按照多态,理论上我们可以传递如下参数:一个ArrayList<Dog>类型的对象(DogAnimal的子类),理论上没问题吧,而实际上却是大有问题的,会编译不通过。

这是为什么呢?DogAnimal的子类,父类存在的地方,子类就可以存在,这应该是没错的啊,这确实是没有错的,错不在多态。我们可以反向思考一下,假设允许上面的情况发生,就是在需要一个ArrayList<Animal>对象的地方你传入了ArrayList<Dog>对象,但接下来发生的情况是否会发生你就无法预料了,就是你在method中调用了anim.add(newCat()),这是可以理解的吧(假设CatAnimal的另一子类),因为方法的参数类型是ArrayList<Animal>类型的,即这个ArrayList中存放的是AnimalCatAnimal的子类所以可以调用anim.add(newCat()),但事实上你传递的确实ArrayList<Dog>类型的,即你向一个存放DogArrayList中存放了其他的对象,根据泛型安全性问题,这是不允许的啊。所以假设不成立,即你不能向一个参数类型为ArrayList<Animal>的方法中传递ArrayList<Dog>类型的对象。(真TM的像用反证法证数学题啊,有木有啊!)

晕了没,希望你没有。

分享到:
评论

相关推荐

    java数组、泛型、集合在多态中的使用及对比

    本文主要介绍了java数组、泛型、集合在多态中的使用及对比。具有很好的参考价值,下面跟着小编一起来看下吧

    Java SE编程入门教程 java泛型(共11页).pptx

    Java SE编程入门教程 java集合(共38页).pptx Java SE编程入门教程 java接口(共21页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共56页).pptx Java SE编程入门教程 java类和对象方法以及包的使用...

    Exer.java(JavaSE泛型学习笔记)

    泛型学习笔记2的源代码,泛型...典型的应用就是在集合中, 集合中理论上可以保存任意对象,实际上我们应该让它泛型化,集合类&lt;元素类型&gt;, 添加元素只能添加指定类型,获取元素时一定能获取指定类型的对象,不需要造型。

    学习Java第二十四天–集合框架之泛型集合

    泛型集合12.3.4 泛型集合泛型的场景:定义泛型:12.3.5 Colletions工具类 12.3.4 泛型集合 概念:参数化类型、类型安全的集合,强制集合元素的类型必须一致; 特点: 编译时即可检查,而非运行时抛出异常; 访问时,...

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    Java集合详解1:一文读懂ArrayList,Vector与Stack使用方法和实现原理 Java集合详解2:Queue和LinkedList Java集合详解3:Iterator,fail-fast机制与比较器 Java集合详解4:HashMap和HashTable Java集合详解5:深入...

    Java SE编程入门教程 java封装继承多态(共56页).pptx

    Java SE编程入门教程 java集合(共38页).pptx Java SE编程入门教程 java接口(共21页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共56页).pptx Java SE编程入门教程 java类和对象方法以及包的使用...

    java最新高薪面试题库.docx

    Java中的多态有哪些实现方式? 什么是抽象类?Java中的抽象类有哪些特点? 什么是接口?Java中的接口有哪些特点? 什么是泛型?Java中的泛型有哪些特点? 什么是反射?Java中的反射有哪些应用场景? 什么是异常?...

    Java SE编程入门教程 java集合(共38页).pptx

    Java SE编程入门教程 java集合(共38页).pptx Java SE编程入门教程 java接口(共21页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共56页).pptx Java SE编程入门教程 java类和对象方法以及包的使用...

    Java 面试问题Java 面试问题示例

    4. 解释一下Java中的封装,继承和多态。 5. 解释什么是Java的异常处理?如何使用它? 6. 描述一下Java中的泛型。你如何在你的代码中使用它? 7. 解释一下Java中的接口和抽象类。它们在什么时候使用? 8. 解释一下...

    java面试常见问题.docx

    请解释Java中的封装、继承和多态的概念是什么? Java中的访问修饰符有哪几种?它们的区别是什么? 请解释Java中的抽象类和接口的概念及区别是什么? 请解释Java中的泛型(Generic)是什么?它有什么作用? Java中的...

    Java工程师面试复习指南

    Java集合详解:一文读懂ArrayList,Vector与Stack使用方法和实现原理 Java集合详解:Queue和LinkedList Java集合详解:迭代器,快速失败机制与比较器 Java集合详解:HashMap和HashTable Java集合详解:深入理解...

    Java面试题合集最新版2024.zip

    集合框架:熟悉Java集合框架中的List、Set、Map等接口及其实现类,如ArrayList、HashSet、HashMap等。 泛型:理解泛型的概念及其在Java中的应用,如泛型类和泛型方法。 并发编程:了解Java中的线程、同步、锁等机制...

    Java期末考试真题试卷及复习资料【高级编程】

    名词解释 泛型 答即参数化类型允许程序创建集合时指定集合元素的类型在定义方法类接口时使用类型形参类型形参将在声明变量调用方法创建对象时动态地指定.如:List,ArrayList 2. 多态 答Java引用变量分为编译时的类型...

    以下是一些常见的JAVA面试题

    6. 解释一下JAVA中的泛型编程,包括泛型类型参数、通配符等的使用。 7. 解释一下JAVA中的基本数据类型和引用类型的区别和使用。 8. 解释一下JAVA中的自动装箱和拆箱机制。 9. 解释一下JAVA中的反射机制,包括Class、...

    Java常见面试题.pdf

    12. 解释 Java 中的集合框架,并举例常用的集合类。 13. 什么是泛型?如何使用泛型? 14. 解释 Java 中的反射机制。 15. 如何连接和操作数据库(如 MySQL)? 16. 什么是 JVM(Java 虚拟机)?它的作用是什么? 17. ...

    Java SE编程入门教程 java判断循环(共79页).ppt

    Java SE编程入门教程 java集合(共38页).pptx Java SE编程入门教程 java接口(共21页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共56页).pptx Java SE编程入门教程 java类和对象方法以及包的使用...

    Java SE编程入门教程 java序列化(共14页).pptx

    Java SE编程入门教程 java集合(共38页).pptx Java SE编程入门教程 java接口(共21页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共56页).pptx Java SE编程入门教程 java类和对象方法以及包的使用...

    JAVA的教程.txt

    JAVA的教程涵盖多个方面,从基础知识到高级编程都有详细的讲解。以下是一些主要的学习内容: ... JAVA集合框架与泛型:JAVA的集合框架提供了丰富的数据结构,如List、Set、Map等。你需要学习如何使用这些数据

    Java基础最全笔记文档

    5. Collection集合、数据结构、List集合、泛型、Set集合、可变参数 6. 集合工具类Collections、Map集合、集合嵌套、不可变集合 7. Stream流、异常处理 8. Logback日志框架、阶段项目 9. File、方法递归、字符集、IO...

    Java综合实验---学生信息管理系统

    3) 将多个对象存放在一个适当的集合中,集合中要使用泛型; 4) 使用合适的方法对集合中的数据按一定的方式排序; 5) 使用迭代器遍历集合并输出集合的元素,将排序后输出的结果写入out.txt文件中,IO操作需要有异常...

Global site tag (gtag.js) - Google Analytics