泛型和通配符

使用泛型和通配符都可以让一个方法所表示的算法逻辑适应多种类型。

Java中具备继承关系的类A、B(A extends B)它们的集合List和List之间是没有继承关系的,

可以使用泛型或通配符来让一个方法支持同时接受List和List

代码场景

这里分别定义类Animal、Dog和Cat,很显然,Dog和Cat是Animal的子类。

它们的简单定义如下:

abstract class Animal {

public abstract boolean afraidOf(Animal other);

}

class Cat extends Animal {

@Override

public boolean afraidOf(Animal other) {

if (other instanceof Dog) {

return true;

}

return false;

}

}

class Dog extends Animal {

@Override

public boolean afraidOf(Animal other) {

if (other instanceof Cat) {

return false;

}

return true;

}

}

上面Animal类定义了boolean afraidOf(Animal other)方法,表示一个动物是否害怕另一个动物。

可以看到Cat和Dog有着不同的表现。

假设有下面需求:

从一个List中找到某个Animal对象害怕的所有其它动物。

对应有以下的API方法:

public List findScaredAnimals(List animals, Animal who) {

//...

}

如果这时有List或者List这种,也应该是支持的。

可以通过通配符或者泛型方法实现。

通配符实现

使用List extends Animal>这样的形参,就可以接收集合项为Animal子类的任意List。

public List findScaredAnimals(List extends Animal> animals, Animal who) {

//...

}

这时就可以这样调用了:

List dogs;

....

findScaredAnimals(dogs, animal);

...

其他Animal子类的List都是可以的。

泛型方法实现

抛开实际意义,假设需要findScaredAnimals()中,返回值和参数对应的具体Animal子类型是一致的,那么就需要用到泛型了:

public List findScaredAnimals(List animals, T who) {

//...

}

可以看到,泛型类型参数T同时约束了多个地方。

泛型参数也可以是多个的,而且之间存在关系。

小结

以上通过一个不太实际的案例说明了使用泛型和通配符来解决List泛型集合之间的“匹配”问题。这也是它们的主要用途之一。

(本文使用Atom编写)

java 泛型 父子_使用通配符和泛型:完成父子类关系的List对象的类型匹配相关推荐

  1. Java应用编程_常用类库汇总2(日期类正则表达式国际化程序)

    总览[Java SE] 相关文章链接 [Java应用编程_常用类库汇总1(字符串处理类&&对象克隆&数字操作类库&-)] [Java应用编程_常用类库汇总3(开发支持类 ...

  2. Java的基础语法(8)-- API常见的类的介绍匿名对象

    十五.API 15.1.概述: API(Application Programming Interface),应用程序编程接口.Java API是一本程序员的字典,是JDK中提供给我们使用的类的说明文 ...

  3. java asynctask完成_如何传递参数并从AsyncTask类中获取结果?

    我想要做的就是使用AsyncTask来执行http请求 . 这是我的代码到目前为止,但我不知道如何从我的主要活动中调用此类以及如何获得结果 . 我有一个String var"uri" ...

  4. Java标签移动_如何使用基于鼠标单击的标签移动特定游戏对象?

    我有一个由6个孩子的游戏对象组成的3D模型,我希望能够点击模型的每个部分并使该部分沿某个方向移动然后再次点击它然后返回到它原来的位置 . 我给每个零件都带了一个标签和一个盒子对撞机我打算让它们在我用碰 ...

  5. c++ 类数组_输入输出流IO体系及常用类关系结构(精要收藏)

    1.IO体系 Java IO 体系看起来类很多,感觉很复杂,但其实是 IO 涉及的因素太多了.在设计 IO 相关的类时,编写者也不是从同一个方面考虑的,所以会给人一种很乱的感觉,并且还有设计模式的使用 ...

  6. java泛型方法 通配符_Java泛型教程–示例类,接口,方法,通配符等

    java泛型方法 通配符 泛型是Java编程的核心功能之一,它是Java 5中引入的.如果您使用的是Java Collections ,并且版本5或更高版本,则可以肯定使用了它. 将泛型与集合类一起使 ...

  7. java反射 用处_浅谈Java反射

    一.何为反射 反射就是对于任何一个类都能知道这个类的的所有属性和方法,并且对于任何一个对象都能调用他的属性和方法,而且能修改其属性. 二.反射的作用 就我的理解来看,通常我们在写代码的时会非常强调代码 ...

  8. Java的泛型特性_学习Java的重中之重!

    Java的"泛型"特性,你以为自己会了 使用Java的小伙伴,对于Java的一些高级特性一定再熟悉不过了,例如集合.反射.泛型.注解等等,这些可以说我们在平时开发中是经常使用到的, ...

  9. Java泛型解析(02):通配符限定

    Java泛型解析(02):通配符限定      考虑一个这种场景.计算数组中的最大元素. [code01] public class ArrayUtil {public static <T> ...

最新文章

  1. 统计学习方法第十四章作业:聚类—层次聚类聚合/分裂算法、K_means聚类算法 代码实现
  2. 全面的framebuffer详解一
  3. php7安装redis扩展和memcache扩展
  4. itext生成pdf paragraph 自动换行_reportlab高级制作多格式PDF和python的class和装饰器复习
  5. [NEHE Couse] 05.3D Objects
  6. 利用二层端口安全防止两个三层交换机长距离光纤线路被乱接测试
  7. 20191127每日一句
  8. codeforces 486 E. LIS of Sequence(dp)
  9. 考研高等数学张宇30讲笔记——第九讲一元函数积分学的几何应用
  10. css如何对上边框加阴影,CSS怎么添加阴影边框?
  11. Excel应用技巧:不规则合并单元格的求和
  12. 人工智能实践:Tensorflow笔记 Class 5:卷积神经网络
  13. 如何优雅的阅读论文——福昕阅读器
  14. Unity3D学习—牧师与魔鬼—MVC模式和ECS架构应用
  15. 福建江夏学院竞赛队新生练习(2021)
  16. 交错校验法 / interleaving
  17. PyQt5(一) PyQt5安装及配置,从文件夹读取图片并显示,模拟生成素描图像
  18. 【Excel 如何对比两个文件】
  19. 魅族18解bl锁+刷boot+刷面具+刷lsp+刷hmspush教程
  20. 切割钢管问题用java循环解决过程

热门文章

  1. LoadRunner8.1破解汉化过程
  2. 快速理解binary cross entropy 二元交叉熵
  3. RUNOOB python练习题3
  4. python 脚本学习(二)
  5. Oracle 数据库之最:你见过最高的 SQL Version 是多少?
  6. 《操作系统真象还原》——0.23 操作系统是如何识别文件系统的
  7. 设计模式总结篇系列:工厂方法模式(Factory Method)
  8. 32位PLSQL Developer无法登录Oracle 11g 64位
  9. linux命令积累之egrep命令
  10. 在Spring boot 配置过滤器(filter)