泛型--继承泛型

2023-05-16

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

42280ff35d80a9fa4ba80a064ba6e694e83.jpg

package com.atguigu.javase.generic;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

// 自定义泛型类, A只能是类类型
class Person<A> { // A在这里表示它是某种类型, 类型的形参, 在本类中就可以直接使用A这个类型.
	// A类型在创建对象时指定.
	// 如果A类型在创建对象时,并未确定的指定, 它就是Object类型, 类型不安全了
	// 泛型类型隶属于对象的, 不同的对象在创建时指定的泛型类型可以不一样
	
	private String name;
	private A info;
	
	public Person() {
	}

	public Person(String name, A info) {
		super();
		this.name = name;
		this.info = info;
	}
	
	public void setInfo(A info) {
		this.info = info;
	}
	
	public A getInfo() {
		return info;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", info=" + info + "]";
	}
	
	/* 静态成员不可以使用泛型类型
	public static void test(A a) {
		
	}*/
	
	/**
	 * 泛型方法, 方法中的泛型类型在方法的返回值之前声明<泛型的类型参数>
	 * 泛型方法必须在形参中指定好特定的类型, 否则泛型方法中的泛型类型永远是Object
	 * 泛型方法中的泛型类型究竟是什么, 由实参来决定.所以是在方法的每一次调用时才能确定的.
	 * 如果实参是null, 则无法确定泛型类型, 只能是Object类型了.
	 * @return
	 */
	public <B> B testB(B b) {
		return null;
	}
}

class A<X> {
	X x;
	
	public X getX() {
		return x;
	}
}
class B extends A {} // 子类在继承时并未指定X的具体类型, 所以永远是Object
class C extends A<String> {} // 子类在继承时直接写死父类的泛型类型, 在子类中X类型永远是一致,不变的
class C2 extends A<Double> {}
class D<X> extends A<X> {} // 子类在继承父类时仍然保持泛型类型的不确定性.

public class GenericTest {
	
	@Test
	public void test6() {
		B b = new B();
		Object x = b.getX();
		
		C c = new C();
		String x2 = c.getX();
		
		D d = new D();
		Object x3 = d.getX();
		D<Integer> d2 = new D<Integer>();
		Integer x4 = d2.getX();
		String x5 = new D<String>().getX();
	}
	
	@Test
	public void test5() {
		List<Integer> list = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++) {
			list.add((int)(Math.random() * 20));
		}
		System.out.println(list);
		
		Object[] array = list.toArray();
		for (Object object : array) {
			System.out.println(object);
		}
		
		System.out.println("**********************");
		
		Integer[] array2 = list.toArray(new Integer[] {});
		for (Integer integer : array2) {
			System.out.println(integer);
		}
	}
	
	@Test
	public void test4() {
		Person<String> person = new Person<String>("张三", "北京");
		Integer testB = person.testB(30);
		String testB2 = person.testB("男");
		Boolean testB3 = person.testB(false);
		Object testB4 = person.testB(null); // 当实参的类型无法确定时, 泛型方法中的类型就是Object
	}
	
	@Test
	public void test3() {
		List<Integer> list1 = new ArrayList<Integer>();
		List<Double> list2 = new ArrayList<Double>();
	}
	
	@Test
	public void test2() {
		// 在这个对象中的A类型就固定是String类型
		Person<String> person = new Person<String>("张三", "北京"); // String在创建对象时,会作为类中的A类型的具体类型
		String info = person.getInfo();
		System.out.println(info);
		
		//person.setInfo(30);
		
		//new Person<Integer>("李四", "上海");
		Person<Integer> person2 = new Person<Integer>("李四", 40);
		Integer info2 = person2.getInfo();
		System.out.println(info2);
	}
	
	@Test
	public void test1() {
		Person person = new Person("张三", 30); // 理论上A类型就是Integer了, 但是没有指定
		Object info = person.getInfo();
		System.out.println(info);
		person.setInfo("男"); // 在这里体现了类型不安全, 因为理论上类型是Integer,但是实际给定的是String
		
		Person person2 = new Person("李四", "女");
		Object info2 = person2.getInfo();
		System.out.println(info2);
	}
}	

c67777ab558099088b6263d0263c0c40e76.jpg

03dd31d728ad3b04fba28e200df46e42ae3.jpg

package com.atguigu.javase.generic;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.junit.Test;

public class GenericTest2 {
	
	public Comparable max(Collection<? extends Comparable> col) {
		Iterator<? extends Comparable> iterator = col.iterator();
		// 假设第1个数最大
		Comparable max = iterator.next();
		// 遍历所有数据, 如果某数据比最小值还小, 刷新最小值
		while (iterator.hasNext()) {
			Comparable next = iterator.next();
			if (next.compareTo(max) > 0) {
				max = next;
			}
		}
		return max;
	}
	
	public Comparable min4(Collection<? extends Comparable> col) {
		Iterator<? extends Comparable> iterator = col.iterator();
		// 假设第1个数最小
		Comparable min = iterator.next();
		// 遍历所有数据, 如果某数据比最小值还小, 刷新最小值
		while (iterator.hasNext()) {
			Comparable next = iterator.next();
			if (next.compareTo(min) < 0) {
				min = next;
			}
		}
		return min;
	}
	// 找出任意集合中的最大值
	@Test
	public void test8() {
		List<Integer> list = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++) {
			list.add((int)(Math.random() * 20));
		}
		System.out.println(list);
		System.out.println(min4(list));
		
		Set<Integer> set = new HashSet<Integer>();
		for (int i = 0; i < 10; i++) {
			set.add((int)(Math.random() * 20));
		}
		System.out.println(set);
		System.out.println(min4(set));
		
		List<String> list2 = new ArrayList<String>();
		list2.add("xxx");
		list2.add("abc");
		list2.add("YYY");
		list2.add("123");
		list2.add("来点汉字");
		list2.add("你好");
		System.out.println(list2);
		System.out.println(min4(list2));
	}
	
	///
	
	public Number min3(Collection<? extends Number> col) {
		Iterator<? extends Number> iterator = col.iterator();
		// 假设第1个数最小
		Number min = iterator.next();
		// 遍历所有数据, 如果某数据比最小值还小, 刷新最小值
		while (iterator.hasNext()) {
			Number next = iterator.next();
			if (next.doubleValue() < min.doubleValue()) {
				min = next;
			}
		}
		return min;
	}
	
	@Test
	public void test7() {
		List<Integer> list1 = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++) {
			list1.add((int)(Math.random() * 20));
		}
		System.out.println(list1);
		System.out.println(min3(list1));
		
		List<Float> list2 = new ArrayList<Float>();
		for (int i = 0; i < 10; i++) {
			list2.add((float)(Math.random() * 20));
		}
		System.out.println(list2);
		System.out.println(min3(list2));
		
		Set<Integer> set = new HashSet<Integer>();
		for (int i = 0; i < 10; i++) {
			set.add((int)(Math.random() * 20));
		}
		System.out.println(set);
		System.out.println(min3(set));
	}
	
	///
	
	public Number min2(List<? extends Number> list) {
		// 假设第1个数最小
		Number min = list.get(0);
		// 遍历所有数据, 如果某数据比最小值还小, 刷新最小值
		for (Number number : list) {
			if (number.doubleValue() < min.doubleValue()) {
				min = number;
			}
		}
		return min;
	}
	
	@Test
	public void test6() {
		List<Integer> list1 = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++) {
			list1.add((int)(Math.random() * 20));
		}
		System.out.println(list1);
		System.out.println(min2(list1));
		
		List<Float> list2 = new ArrayList<Float>();
		for (int i = 0; i < 10; i++) {
			list2.add((float)(Math.random() * 20));
		}
		System.out.println(list2);
		System.out.println(min2(list2));
	}
	
	///
	
	// 写一个方法 double min(List<????> list) 
	public double min(List<? extends Number> list) {
		// 假设第1个数最小
		double min = list.get(0).doubleValue();
		// 遍历所有数据, 如果某数据比最小值还小, 刷新最小值
		for (Number number : list) {
			if (number.doubleValue() < min) {
				min = number.doubleValue();
			}
		}
		return min;
	}
	
	// 在测试方法中创建两个List集合, 一个保存随机整数, 另一个保存Float型随机数据
	@Test
	public void test5() {
		List<Integer> list1 = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++) {
			list1.add((int)(Math.random() * 20));
		}
		System.out.println(list1);
		System.out.println(min(list1));
		
		List<Float> list2 = new ArrayList<Float>();
		for (int i = 0; i < 10; i++) {
			list2.add((float)(Math.random() * 20));
		}
		System.out.println(list2);
		System.out.println(min(list2));
	}
	
	public double avg(List<? extends Number> list) {
		double sum = 0;
		for (Number num : list) {
			sum += num.doubleValue();
		}
		return sum / list.size();
	}
	
	
	@Test
	public void test4() {
		List<Integer> list = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++) {
			list.add((int)(Math.random() * 20));
		}
		System.out.println(list);
		System.out.println(avg(list));
		
		List<Double> list2 = new ArrayList<Double>();
		for (int i = 0; i < 10; i++) {
			list2.add((Math.random() * 20));
		}
		System.out.println(list2);
		System.out.println(avg(list2));
	}
	
	/*public int avg(List<Integer> list) {
	int sum = 0;
	for (Integer integer : list) {
		sum += integer;
	}
	return sum / list.size();
}*/
	
	@Test
	public void test3() {
		// 集合中保存的是Number类型及其未知父类   类型范围>= Number
		List<? super Number> list = new ArrayList<>();
		list.add(200); // 适合添加, 因为它里面可以保存至少是Number类型的对象
		list.add(2.5);
		
		Object object = list.get(0); // 不适合于获取, 因为是未知父类
		
		// 集合中保存的是Number类型及其未知子类类型, 类型范围 <= Number
		List<? extends Number> list2 = new ArrayList<>();
		//list2.add(200); // 不可以添加元素, 因为具体的子类类型是未知的. 不可以冒然添加元素
		//list2.add(2.8);
		Number number = list2.get(0); // 适合于获取, 因为最多就是Number. 
	}
	
	/**
	 * 此方法对于集合的访问是只读的, 更安全
	 * @param col
	 */
	public void travel(Collection<?> col) {
		for (Object object : col) {
			System.out.println(object);
		}
	}
	
	@Test
	public void test2() {
		List<Integer> list = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++) {
			list.add((int)(Math.random() * 20));
		}
		travel(list);
	}
	
	@Test
	public void test1() {
		List<Integer> list1 = new ArrayList<Integer>();
		//List<Number> list2 = new ArrayList<Integer>(); // 原因是左侧的集合中保存的是范围更大的类型.
		// List<?>list 集合只能获取, 不能添加, 所以适用于只读访问.
		List<?> list2 = new ArrayList<Integer>(); // ?表示未知类型, 范围不确定
		//list2.add(100); // 绝对不可以... 因为集合中的类型未知, 不可以冒然添加
		//list2.add(new Object());
		list2.add(null); // 因为null不表示任何类型
		
		Object object = list2.get(0);
		
		List<Object> list3 = new ArrayList<Object>();
		list3.add(200);
	}
}

 

转载于:https://my.oschina.net/architectliuyuanyuan/blog/3055274

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

泛型--继承泛型 的相关文章

  • floating IP 原理分析 - 每天5分钟玩转 OpenStack(107)

    上一节我们通过 Web UI 创建为 cirros vm3 分配了浮动 IP xff0c 今天将分析其工作原理 首先查看 router 的 interface 配置 xff1a 可以看到 xff0c floating IP 已经配置到 ro
  • linux移动硬盘挂载错误,suse挂载移动硬盘出错

    suse挂载移动硬盘出错 发布时间 2008 04 29 11 46 54来源 红联作者 Dnirta 刚刚挂移动硬盘想装个东西 xff0c 结果盘符出来了 xff0c 却打不开 有提示 root 64 localhost mount t
  • 【webapp的优化整理】要做移动前端优化的朋友进来看看吧

    单页or多页 本文仅代表个人观点 xff0c 不足请见谅 xff0c 欢迎赐教 webapp 小钗从事单页相关的开发一年有余 xff0c 期间无比的推崇webapp的网站模式 xff0c 也整理了很多移动开发的知识点 xff0c 但是现在回
  • Dell的Linux服务器开机按F1解决方法

    最近买了些二手服务器 xff0c dell品牌 xff0c 性价比还不错 xff0c 但是一台dell 服务器开机总是提示按F1才能进系统 到底应该怎么解决呢 xff1f 请问我的电脑开机老是提示 strike the f1 key to
  • ADB 操作命令详解及用法大全

    一 ADB是什么 xff1f ADB xff0c 即 Android Debug Bridge 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具 xff0c 它可为各种设备操作提供便利 xff0c 如安装和调试应用 xf
  • 在OpenResty中使用淘宝的concat进行css和js合并,同时支持GZIP静态压缩

    61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • cygwin64安装wget和apt-cyg

    说实话 xff0c 网上的教程要么不适用 xff0c 要么不能用 xff0c 唯有多次试错之后才杀出一条血路 1 安装cygwin 2 勾选wget 这个如果忘记勾选了 xff0c 就再次打开setup exe 选择如下操作 xff0c 即
  • React系列——websocket群聊系统在react的实现

    前奏 这篇文章仅对不熟悉在react中使用socket io的人 以及websocket入门者有帮助 下面这个动态图展示的聊天系统是用react 43 express 43 websocket搭建的 xff0c 很模糊吧 xff0c 要得就
  • JNA 实际开发中若干问题解决方法(二)

    1 JNA 中 byte 类型映射问题 在之前的文章中 xff0c 我们知道 JNA 中 xff0c char 和 char 类型都可以映射为 byte 类型 xff0c 通常来说也就是 byte 具有通用性 在实际开发中 xff0c 我们
  • 独家解读 | 智能驾驶视觉技术领域四类供应商及其商业化路径

    9 月 3 日 xff0c 雷锋网新智驾正式对外发布了 2018 智能驾驶视觉技术行业研究报告 xff0c 对智能驾驶技术感兴趣的读者可加入 新智驾会员计划 免费阅读本报告 xff0c 也可以通过官方渠道单独购买后进行查阅 首份报告发布两天
  • MySQL存储过程与存储函数

    1 创建存储过程 存储过程就是一条或者多条 SQL 语句的集合 xff0c 可以视为批文件 它可以定义批量插入的语句 xff0c 也可以定义一个接收不同条件的 SQL 创建存储过程的语句为 create procedure xff0c 创建
  • Vue+SpringBoot实现增删改查

    Vue 43 Spring boot Vue前端 Vue新建项目 当前我是用的是vue脚手架3 4 1版本 github地址 xff1a github com liangcongco vue create vue demo 新建项目 spa
  • 一例关于无法删除VMware虚拟机文件的案例

    关键字 xff1a VMware ESXi 虚拟机 操作背景 xff1a 由于运维不当导致一台虚拟机挂掉 xff0c 期望删除该VM的文件夹 xff0c 但从vCenter界面或者用指令界面 xff0c 均提示无法删除 xff0c 文件被占
  • PS安装扩展面板提示无法加载,因为它未经正确签署解决方法(适用于Mac/Win)

    最近发现好多小伙伴在使用Photoshop Mac端或者win端安装ps扩展面板时 总会遇到Photoshop错误提示无法加载 因为它未经正确签署 今天小编就和大家分享解决Mac Win端ps扩展面板提示无法加载 因为它未经正确签署解决方法
  • FTP连接不上的解决方法

    1 注意内网IP和外网IP 2 检查ftp服务是否启动 xff08 面板首页即可看到 xff09 3 检查防火墙20端口 ftp 21端口及被动端口39000 40000是否放行 xff08 如是腾讯云 阿里云等还需检查安全组 xff09
  • Arduino和C51开发OLED显示屏

    技术 xff1a 51单片机 Arduino OLED显示屏 U8glib 概述 OLED显示屏常常用作为智能产品的显示设备 xff0c 本文简单介绍OLED显示屏的使用方法 详细 代码下载 xff1a http www demodashi
  • mac 查看 本地网络代理

    networksetup listallnetworkservices 转载于 https www cnblogs com yshuai p 7813258 html
  • 常用的ROS命令

    在这里记一下 xff0c 以免以后忘记了 打开ros master xff1a roscore 查看topic列表 xff1a rostopic list v 打印topic内容 xff1a rostopic echo topic 将bag
  • platform下的js分析_2

    目录 主要包含 url js utils js requiring frame js attribute js CCMacro js CCSys js CCScreen js CCVisibleRect js callbacks invok
  • 重学前端学习笔记(六)--JavaScript类型有哪些你不知道的细节?

    笔记说明 重学前端是程劭非 xff08 winter xff09 前手机淘宝前端负责人 在极客时间开的一个专栏 xff0c 每天10分钟 xff0c 重构你的前端知识体系 xff0c 笔者主要整理学习过程的一些要点笔记以及感悟 xff0c

随机推荐

  • 用nvm安装node后,发现npm下载总是失败的解决办法

    用nvm安装node后 xff0c 发现npm下载总是失败的解决办法 执行安装命令如下出现npm下载失败 xff0c 尝试多次都不成功 xff1a C windows system32 gt nvm install 14 17 3 Down
  • OpenStack —— DevStack一键自动化安装

    一 DevStack介绍 Devstack 目前是支持Ubuntu16 04和CentOS 7 xff0c 而且Devstack官方建议使用Ubuntu16 04 xff0c 所以我们使用Ubuntu 16 04进行安装 默认无论是Devs
  • 树莓派3b+安装

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 贴散热片 xff1a 背面一片 xff0c 正面两篇 二 系统安装 xff1a 1 使用SD Formatter格式化SD卡 2 使用Win32DiskImager写入
  • Amap地图轨迹

    最近在做运动相关的项目 xff0c 需要运动轨迹 xff0c 接了一下Google xff0c 头一天还能获取Location xff0c 之后就没法用了 xff0c 所以换成高德 xff0c 高德的地图包Amap 使用高德地图定位Loca
  • 实现一个最小的 CSS 响应式布局系统

    阳光里她在院子中央晾晒着衣裳 在四季的风中她散着头发安慰着时光 赵雷 南方姑娘 响应式布局系统 xff0c 在现在流行的 CSS 框架中已经非常常见了 它主要由容器类和约定一行列数的栅格系统组成 xff0c 组成了一个框架的骨架 在流行的前
  • 写了一个拖动排序插件

    drag js drag js是一款拖动排序插件 xff0c 适配pc端和手机端 demo地址 tls1234 github io drag html 结构 lt ul class 61 34 item group 34 gt lt li
  • 关于工程效能的思考

    继阿里大中台之后 xff0c 现在的科技公司大多有一支致力于提升公司研发效率和沟通协作的工程效能团队 xff0c 作为这样团队的一员 xff0c 却看到愿景和现实激烈碰撞 xff0c 不禁有如下思考 效率的提升并不能减少工作时长 就拿前端研
  • May-周记(1)

    1 封装一个ajax span class hljs comment 封装一个ajax原生写法 span span class hljs function span class hljs keyword function span span
  • 程序员从阿里、京东、美团…面试回来,这些面试题你都会吗?

    面试 xff0c 难还是不难 xff1f 最终结果好还是不好 xff1f 取决于面试者的底蕴 xff08 气场 43 技能 xff09 心态和认知以及沟通技巧 而一些主流的大型互联网公司面试 xff08 阿里巴巴 京东 美团 滴滴 xff0
  • js深拷贝和浅拷贝

    数组的深浅拷贝 浅拷贝 var arr 61 span class hljs string 34 One 34 span span class hljs string 34 Two 34 span span class hljs strin
  • OpenGL/OpenGL ES入门:纹理初探 - 常用API解析

    系列推荐文章 xff1a OpenGL OpenGL ES入门 xff1a 图形API以及专业名词解析 OpenGL OpenGL ES入门 xff1a 渲染流程以及固定存储着色器 OpenGL OpenGL ES入门 xff1a 图像渲染
  • 获取hadoop集群资源信息

    根据hadoop提供的restful接口获取 http hadoop apache org docs stable gt YARN REST APIs gt Resource Manager 1 获取每个node的信息 import url
  • java版电子商务spring cloud分布式微服务b2b2c社交电商 (八)springboot整合mongodb

    电子商务社交平台源码请加企鹅求求 xff1a 三五三六二四七二五九 准备工作 安装 MongoDBjdk 1 8maven 3 0idea 环境依赖 在pom文件引入spring boot starter data mongodb依赖 xf
  • 金丝雀发布、滚动发布、蓝绿发布到底有什么差别?关键点是什么?

    为什么80 的码农都做不了架构师 xff1f gt gt gt 根据 2017 年的 DevOps 发展报告 xff0c 高效能组织和低效能组织在软件交付的效率上有数量级上的差异 技术组织的软件交付能力是一种综合能力 xff0c 涉及众多环
  • MongoDB的无缝集成,重拾后端之Spring Boot

    MongoDB是什么 xff1f MongoDB是一个NoSQL数据库 xff0c 是NoSQL中的一个分支 xff1a 文档数据库 和传统的关系型数据库比如Oracle SQLServer和MySQL等有很大的不同 传统的关系型数据库 x
  • 关于区块链智能合约的真相

    2019独角兽企业重金招聘Python工程师标准 gt gt gt title 关于智能合约的真相 就像 区块链 xff0c AI 和 云 这样的词语一样 xff0c 智能合约 也是那些得到大量炒作的短语之一 毕竟 xff0c 没有什么比不
  • 访问者模式

    2019独角兽企业重金招聘Python工程师标准 gt gt gt https blog csdn net jason0539 article details 45146271 转载于 https my oschina net u 2511
  • zip不是内部或外部命令,也不是可执行程序”详细解决办法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 书中第11章学习实例 xff1a 将文件备份成一个zip文件 xff08 python实现 xff09 书中源码 xff08 文件目录是自己新建文件夹的路径 xff0c 和
  • Struts2学习:HelloWorld

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 项目结构 xff1a 1 用IDEA新建一个SpringBoot 43 Maven的项目 2 新建的项目是没有webapp WEB INF 与web xml文件的 xff0
  • 泛型--继承泛型

    2019独角兽企业重金招聘Python工程师标准 gt gt gt package com atguigu javase generic import java util ArrayList import java util List im