泛型和通配符

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

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

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

代码场景

这里分别定义类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>中找到某个Animal对象害怕的所有其它动物。

对应有以下的API方法:

public List<Animal> findScaredAnimals(List<Animal> animals, Animal who) {
//...
}

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

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

通配符实现

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

public List<Animal> findScaredAnimals(List<? extends Animal> animals, Animal who) {
//...
}

这时就可以这样调用了:

List<Dog> dogs;
....
findScaredAnimals(dogs, animal);
...

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

泛型方法实现

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

public <T extends Animal> List<T> findScaredAnimals(List<T> animals, T who) {
//...
}

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

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

小结

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

(本文使用Atom编写)

使用通配符和泛型:完成父子类关系的List对象的类型匹配的更多相关文章

  1. 7. Orcle树形结构(类似数据字典有父子类关系),查询末节点的所有记录

    SELECT a.*FROM tablename aWHERE NOT EXISTS (SELECT 1 FROM tablename b WHERE b.Fid = a.id)START WITH ...

  2. java内部类、接口、集合框架、泛型、工具类、实现类

    .t1 { background-color: #ff8080; width: 1100px; height: 40px } 一.内部类 1.成员内部类. (1)成员内部类的实例化: 外部类名.内部类 ...

  3. java数据类型:集合存储元素类型限制<泛型> ;自定义类指定泛型<T> 以及限制用法;派生子类泛型<T> super(泛型内参数); 泛型通配符?以及?限制用法

    问题背景 Java 集合有个缺点,把一个对象"丢进"集合里之后,集合就会"忘记"这个对象的数据类型,当再次取出该对象时 该对象的编译类型就变Object类型(其 ...

  4. Spring和SpringMVC父子容器关系初窥

    一.背景 最近由于项目的包扫描出现了问题,在解决问题的过程中,偶然发现了Spring和SpringMVC是有父子容器关系的,而且正是因为这个才往往会出现包扫描的问题,我们在此来分析和理解Spring和 ...

  5. C++父子类继承时的隐藏、覆盖、重载

    存在父子类继承关系时,若有同名成员函数同时存在,会发生隐藏.覆盖和重载这几种情况.对于初学者也比较容易混淆,为此,我整理了一下我的个人看法,仅供参考.希望对大家理解有帮助,也欢迎指正. 1.父子类继承 ...

  6. SpringMVC与Spring的父子容器关系

    问题: 在整合框架的时候有人也许会产生一个问题:能不能只配置一个扫描包加载实现类的扫描驱动,即在根目录下扫描所有的注解(@Controller.@Service.@Repository.@Compne ...

  7. JAVA基础--JAVA 集合框架(泛型、file类)16

    一.集合总结 集合:Collection体系.Map体系. Collection体系:单列集合的共性操作规则. List:列表,可以重复,有下标,拥有特有的迭代器ListIterator. Array ...

  8. JAVA基础--JAVA 集合框架(泛型、file类)

    一.集合总结 集合:Collection体系.Map体系. Collection体系:单列集合的共性操作规则. List:列表,可以重复,有下标,拥有特有的迭代器ListIterator. Array ...

  9. 这一次搞懂Spring Web零xml配置原理以及父子容器关系

    前言 在使用Spring和SpringMVC的老版本进行开发时,我们需要配置很多的xml文件,非常的繁琐,总是让用户自行选择配置也是非常不好的.基于约定大于配置的规定,Spring提供了很多注解帮助我 ...

随机推荐

  1. project3 blockchain

    [概念] 做服务的时候main里面不能单独有东西,都得包起来. Identifier expected是因为没有main函数 雾草,task3还要加proxy, add再干别的.难受!妈的,什么代理模 ...

  2. php-fpm重启

    Ubuntu 18.04服务器 修改php init 文件后(/etc/php/7.2/fpm/php.ini)需要重启php-fpm,方法是: kill -USR2 `cat /run/php/ph ...

  3. Codeforces Round #553 (Div. 2) A题

    题目网址:http://codeforces.com/contest/1151/problem/A 题目大意:给定一个由大写字母构成的字符串和它的长度,有这样的操作,使任意一个字母变成与其相邻的字母, ...

  4. NET CORE 2.0发布在IIS上提示502.5错误

    在装了WindowsHosting和NET CORE SDK后,如果没有重启服务器,访问站点报以上错误,解决办法要么重启,要么执行以下两条命令: net stop was /y net start w ...

  5. 玩转postman(一)-----基础

    postman的GUI界面以及各个组件介绍 主界面如下 打开postman的GUI界面以及各个元素组件介绍 分为下三部分: 1.Head navigation bar (头部导航栏):此部分有以下选项 ...

  6. Unity3D UI适配

    直接贴图

  7. 14. Redis配置统计字典

    14. Redis配置统计字典14.1 info系统状态说明14.1.1 命令说明14.1.2 详细说明14.2 standalone配置说明和分析14.2.1 总体配置14.2.2 最大内存及策略1 ...

  8. RIDE安装操作

    转载参考https://www.cnblogs.com/Ming8006/p/4998492.html 一.python安装 1.访问Python官网:https://www.python.org/  ...

  9. day 14:深浅copy,数据结构 ,函数,set集合,变量作用域、返回值

    本节内容: 1,深浅copy 2,数据结构 3,函数 4,变量作用域 5,返回值,return 一.深浅copy 首先理解当给变量赋值的时候,是给变量存在值所在的内存地址 a = 10000 b = ...

  10. PS教程:大神教你用PS制作《大鱼海棠》海报

        本来做的是一千左右像素的,但最后粗心让我存成500几px的了,可能会有点不清楚,唉,忙活这莫久竟然不敌最后一步的粗心呀     教程有千千万,但跟着作就好像是以前幼儿园老师拿着你的手写字,你可 ...