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

泛型和通配符

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

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编写)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/393272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重定向描述符

文件描符 缩写 描述 0 STDIN 标准输入 1 STDOUT 标准输出 2 STDERR 标准错误 1、重定向错误和数据 1234[rootlogicserver tmp]# ls -al data1 haha 2> qingyun.txt 1&g…

NodeJS学习笔记(一)——搭建开发框架Express,实现Web网站登录验证

目录 开发环境  1、建立工程  2、目录结构  3、Express配置文件  4、Ejs模板  5、安装常用库及页面分离  6、路由  7、session  8、页面访问控制及提示JS是脚本语言,脚本语言都需要一个解析器才能运行。对于写在HTML页面里 的JS,浏览器充…

LeetCode-208 Implement Trie (Prefix Tree)

题目描述 Implement a trie with insert, search, and startsWith methods. 题目大意 实现对一棵树的插入、搜索以及前序查找操作。 (树的每个节点代表一个小写字母,从根节点到叶节点代表一个完整的单词) 示例 E Trie trie new Trie();trie.…

react组件生命周期_React组件生命周期-挂钩/方法介绍

react组件生命周期React components have several lifecycle methods that you can override to run your code at a particular time in the process.React组件具有几种生命周期方法,您可以重写它们以在流程中的特定时间运行代码。 In this video, Nick Karnik de…

(马世龙)Linux下CACTI完全搭建技术文档二

续(马世龙)Linux下CACTI完全搭建技术文档一 6.完成cacti的安装1. 首先检查一下rra/下面,有没有数据2. snmpwalk -v 2c -c public ServerIP if 用来测试被控对象(serverIP)是否开启了SNMP服务3. snmpwalk -v 2c ServerIP -c public .1.3.6.1.4…

项目经理如何管理情绪?这三本书管理书籍你必须要看

本文主要是介绍三本管理的书籍,需要全部书籍的可以加Q群375508415去拿走。里面很多大神的PMP资料。 大家有没有觉得项目经理有时像个政委,做员工思想工作; 有时像个HR,操心员工的稳定和发展; 有时像个咨询顾问&#xf…

java 外部接口调用 设计模式_《Java设计模式》之接口模式

-----------模式是思想的体现,而非具体的实现。抽象的讲,类的接口是类允许其他类对象访问的方法与字段集。接口通常代表一种承诺,即方法需要实现接口方法名表示的操作,遵循代码注释和其他文档说明,类的实现就是方法体中…

BFS(广度优先搜索)

Catch That Cow Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer …

leetcode111. 二叉树的最小深度(队列)

给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回它的最小深度 2.代码 /*** Definition for a binary tree no…

企业网站6个常见的优化漏洞

导读:企业做营销网站目的,就是希望通过网络营销,挖掘目标客户。目标客户怎么来,那就需要通过网站优化,把网站关键词优化排名到首页,这样才能更多的机会被潜在客户点击。很多企业网站上线之前,没…

aspx 微型_最初的十亿分钟:正在向世界授课的微型非营利组织背后的数字

aspx 微型by Quincy Larson昆西拉尔森(Quincy Larson) 最初的十亿分钟:正在向世界授课的微型非营利组织背后的数字 (The First Billion Minutes: The Numbers Behind the Tiny Nonprofit That’s Teaching the World to Code) People have now spent more than 1 b…

[RN] React Native 自定义导航栏随滚动渐变

React Native 自定义导航栏随滚动渐变 实现效果预览: 代码实现: 1、定义导航栏 NavPage.js import React, {Component} from react; import {View, Text, Image, StyleSheet, TouchableOpacity, Platform, Dimensions} from react-native;/*** 自定义导航…

【CSS 技能提升】 :before和:after的使用

前几天的晚上较全面的去看了下css的一些文档和资料,大部分的样式运用都没什么大问题了,只是有些许较陌生,但是也知道他们的存在和实现的是什么样式。今天主要想在这篇学习笔记中写的也不多,主要是针对:before和:after写一些内容&a…

c语言模拟java面向对象_纯c语言实现面向对象分析与示例分享

#include #include //接口#ifndef Interface#define Interface struct#endif//类#ifndef Class#define Class struct#endif//抽象形状类Class Shape;typedef Class Shape shape;//抽象形状类的方法声明shape* Shape(int edges);int shape_getEdges(shape *);int shape_getArea(…

leetcode152. 乘积最大子数组

给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 代码 class Solution {publi…

成功试验基于C#/.NET的Android开发

今天最开心事情莫过于摸索验证了一个事情,C#也能进行Android和IOS开发,白天安装了开发环境,晚上进行测试,直到此时此刻,已经成功的导出一款基于C#/.NET的安卓APK,并且能够成功的导入到安卓手机运行&#xf…

使用机器学习预测天气_如何使用机器学习根据文章标题预测喜欢和分享

使用机器学习预测天气by Flavio H. FreitasFlavio H.Freitas着 如何使用机器学习根据文章标题预测喜欢和分享 (How to predict likes and shares based on your article’s title using Machine Learning) Choosing a good title for an article is an important step in the …

深入理解了MySQL,你才能说熟悉数据库

先抛出几个问题 1.为什么不建议使用订单号作为主键?2.为什么要在需要排序的字段上加索引?3.for update 的记录不存在会导致锁住全表?4.redolog 和 binlog 有什么区别?5.MySQL 如何回滚一条 sql ?6.char(50) 和 varchar(50) 效果是一样的么?索引知识回顾 对于 MySQL 数据库…

ibatis mysql 自增_mybatis自增主键

简单介绍:在使用mybats插入数据是,有很多需要和id关联的其他数据,所以在插入一条信息时获取其主键信息是很常见的操作。一 mysql数据库的主键自增(int类型的主键)1 创建一个表,设置表的id(此id必须是int类型),设置为au…

DataGridView控件用法二:常用属性

通常会设置的DataGridView的属性如下: AllowUserToAddRows - False指示是否向用户显示用于添加行的选项,列标题下面的一行空行将消失。一般让其消失。AllowUserToDeleteRows - False指示是否允许用户从DataGridView删除行。一般不允许。AllowUserToOrder…