Java第十五天,泛型
一、定义
泛型是一种未知的数据类型,即当我们不知道该使用哪种数据类型的时候,可以使用泛型。
泛型的本质是为了 参数化 类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
在定义类或者方法或者接口的时候,是无法指定需要的参数类型的。这时候,我们需要将参数类型设置为一个参数。这就是所谓的参数化类型。
二、基本使用
1.存在泛型参数的类
注:含有泛型的类只有在创建对象的时候,才能确定泛型的数据类型。
(1)定义
修饰符 class genericClass<E>{
修饰符 genericClass(){ //不带参构造函数
}
修饰符 genericClass(E e){ //带参构造函数
}
}
(2)创建泛型类对象
genericClass<E> obj = new genericClass<>(); //无参构造函数创建对象
或
E e = new E();
genericClass<E> obj = new genericClass<>(e); //带参构造函数创建对象
2.含有泛型的方法
注:只有在调用方法的时候,才能确定泛型的数据类型。
(1)定义
修饰符 <E> 返回值类型 方法名(E或者普通参数){
}
(2)代码:
泛型类:
package com.lanyue.day12;
public class genericLearn{
public <E> String getName(E e){
if(e instanceof Stu){
return ((Stu) e).getName();
}else{
return "数据类型转换错误";
}
}
}
泛型类测试需要的类:
package com.lanyue.day12;
public class Stu {
private int age;
private String name;
public Stu(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
}
运行代码:
package com.lanyue.day12;
public class Demo {
public static void main(String[] args) {
Stu stu = new Stu(20,"胡海");
genericLearn stuOne = new genericLearn();
System.out.println(stuOne.getName(stu));
}
}
3.含有泛型的接口
(1)定义含有泛型的接口
修饰符nterface<E>{
}
(2)定义实现泛型接口的实现类
方法①:指定实现类接受参数类型
修饰符 class 类名 implements 接口<指定数据类型>{
}
方法②:让实现类接受的参数类型继续为泛型
修饰符 class 类名<泛型> implements 接口<泛型>{
}
(3)代码:
USB接口代码:
package com.lanyue.day13;
public interface Usb<E> {
public abstract void inPut(E e);
public abstract void outPut(E e);
}
USB接口实现类一:
package com.lanyue.day13;
public class UsbImpl implements Usb<String>{
@Override
public void inPut(String info) {
System.out.println("正在往优盘传输数据" + info);
}
@Override
public void outPut(String info) {
System.out.println("正在从优盘拷贝数据" + info);
}
}
USB接口实现类二:
package com.lanyue.day13;
public class UsbImplTwo<E> implements Usb<E> {
@Override
public void inPut(E e) {
if(e instanceof Stu){
System.out.println("正在拷贝" + ((Stu) e).getName() + "同学的信息到优盘");
}else{
System.out.println("数据解析失败");
}
}
@Override
public void outPut(E e) {
if(e instanceof Stu){
System.out.println("正在从优盘拷贝" + ((Stu) e).getName() + "同学的信息");
}else{
System.out.println("数据解析失败");
}
}
}
中间自定义类:
package com.lanyue.day13;
public class Stu {
public String name;
public Stu(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
运行类:
package com.lanyue.day13;
public class Demo {
public static void main(String[] args) {
UsbImpl usbOne = new UsbImpl();
usbOne.inPut("Java");
usbOne.outPut("C++");
Stu stu = new Stu("蓝月");
UsbImplTwo usbTwo = new UsbImplTwo();
usbTwo.inPut(stu);
usbTwo.outPut(stu);
usbTwo.inPut("蓝月");
usbTwo.outPut("蓝月");
}
}
4.泛型通配符
当使用泛型类或者泛型接口时,传递的数据中,泛型类型不确定。可以通过通配符<?>表示。但是一旦使用泛型通配符之后,只能使用Object类中的共性方法。集合中元素的特有方法无法使用。且只能接受数据,而不能往该集合中存储数据。
(1)注意
① 被泛型通配符修饰的类或接口的实现类 不能创建对象使用,只能作为方法的参数使用。
② 泛型是没有继承概念的。
③ 受限泛型
1).泛型的上限:只能接受该类型和其子类
定义格式:
类名 <? extends 类> 对象名称
2)泛型的下限:只能接受该类型和其父类
定义格式:
类名 <? super 类> 对象名称
3)代码:
整体框架简介:
为了测试泛型通配符的用法,我们需要一个父类Person,两个子类Stu和Worker分别继承了父类。在Usb接口的实现类UsbImpl中,我们完成了对泛型通配符的利用。
Person类:
package com.lanyue.day14;
public class Person {
public static int ID = 1;
public String name;
public Person(){
ID++;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Stu类:
package com.lanyue.day14;
public class Stu extends Person{
public String workPlace = "石家庄职业技术学院";
public String getWorkPlace(){
return workPlace;
}
}
Worker类:
package com.lanyue.day14;
public class Worker extends Person{
public String workPlace = "富士康";
public String getSP() {
return workPlace;
}
public String getWorkPlace() {
return workPlace;
}
}
Usb接口:
package com.lanyue.day14;
import java.util.ArrayList;
public interface UsbInt {
public abstract void getInfo(ArrayList<? extends Person> list);
}
Usb接口实现类——UsbImpl类:
package com.lanyue.day14;
import java.util.ArrayList;
import java.util.Iterator;
public class UsbImpl implements UsbInt {
@Override
public void getInfo(ArrayList<? extends Person> list) {
Iterator<? extends Person> iterator = list.iterator();
while(iterator.hasNext()){
Person person = iterator.next();
System.out.println("已在数据库中查找到 " + person.getName() + " 同学");
}
}
}
运行代码:
package com.lanyue.day14;
import java.util.ArrayList;
public class Demo {
public static void main(String[] args) {
Stu one = new Stu();
one.setName("蓝月");
Worker two = new Worker();
two.setName("天行");
Person three = new Person();
three.setName("逍遥");
UsbImpl usb = new UsbImpl();
ArrayList<Stu> stus = new ArrayList<>();
stus.add(one);
ArrayList<Worker> works = new ArrayList<>();
works.add(two);
ArrayList<Person> persons = new ArrayList<>();
persons.add(three);
usb.getInfo(stus);
usb.getInfo(works);
usb.getInfo(persons);
}
}
Java第十五天,泛型的更多相关文章
- “全栈2019”Java第九十五章:方法中可以定义静态局部内部类吗?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第十五章:Unicode与转义字符
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第二十五章:流程控制语句中循环语句while
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 《Java编程思想》笔记 第十五章 泛型
1 泛型 “泛型”意思就是适用于许多类型. 使用泛型的目的之一: 指定容器持有什么类型,让编译器确保正确性,而不是在运行期发现错误. 这个容器可以看成是有其他类型对象作为成员的类,而不单单只是JDK中 ...
- Java笔记(五)泛型
泛型 一.基本概念和原理 泛型将接口的概念进一步延申,“泛型”的字面意思是广泛的类型. 类.接口和方法都可以应用于非常广泛的类型,代码与它们能够操作 的数据类型不再绑定到一起,同一套代码可以应用到多种 ...
- 菜鸟学Java(十五)——Java反射机制(二)
上一篇博文<菜鸟学编程(九)——Java反射机制(一)>里面,向大家介绍了什么是Java的反射机制,以及Java的反射机制有什么用.上一篇比较偏重理论,理论的东西给人讲出来总感觉虚无缥缈, ...
- Java初学者笔记五:泛型处理
一.泛型类: 泛型是指适用于某一种数据类型而不是一个数据机构中能存不同类型 import java.io.*; import java.nio.file.Files; import java.nio. ...
- java 深入技术五 (泛型)
1.泛型概述 泛型的本质:参数化类型 定义 Object obj=new Object();//并不是所有类都可以使用泛型 List <String> list=new ArrayList ...
- Java笔记(十五)……面向对象IV多态(polymorphism)
概述 定义:某一类事物的多种存在形态. 例:动物中猫,狗. 猫这个对象对应的类型是猫类型 猫 x = new 猫(); 同时猫也是动物中的一种,也可以把猫称为动物. 动物 y = new 猫(); 动 ...
随机推荐
- Python1-变量
一.变量和简单数据类型 1.变量 命名规则: 变量名组成——字母.下划线.数字(不可做首字符): 用下划线分隔单词,不可包含空格: 关键字和函数名不可做变量名: 小写字母做变量名,不建议使用大小写的字 ...
- GO系列 | 5分钟入门GO【译】
什么是Google Go? Google Go是由Robert Griesmer,Rob Pike和Ken Thompson在Google设计的一种开源编程语言. Go在语法上类似于C语言: 除了内存 ...
- go源码分析(三) 使用go http包开发web时遇到的坑之卸载插件,重启插件管理,仍然可以访问已经卸载的插件
问题描述: web页面下发重启指令后,对卸载插件的处理不完整(虽然列表已经没有插件描述,但是在HandleFunc的路由列表中依然存在) 我们需要清空路由列表map 路由列表结构见代码: net/ht ...
- 学习Shader所需的数学基础(坐标系,点和矢量)
数学对于计算机图形学的重要性是不言而喻的.在学习Shader之前,首先就要打好数学基础,好在入门Unity Shader所需的数学知识都是线性代数中很基础的的内容.按部就班的来,第一篇文章记录总结的是 ...
- this.current = params.page || 1 (前提是params对象一定要存在)
this.current = params.page || 1 (前提是params对象一定要存在)
- SpringBoot 集成MQTT配置
目录 1. 前言 2. MQTT介绍 3. SpringBoot 集成MQTT 3.1 导入mqtt库 3.2 配置MQTT订阅者 3.3 配置MQTT发布者 3.4 MQTT消息处理和发送 3.4. ...
- SpringBoot的启动流程是怎样的?SpringBoot源码(七)
注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 温故而知新 本篇接 SpringBoot内置的各种Starter是怎样构建的? SpringBoot源码(六) 温故而知新, ...
- Journal of Proteome Research | Mining the Proteome Associated with Rheumatic and Autoimmune Diseases(挖掘风湿和自身免疫疾病相关的蛋白组)(解读人:黄旭蕾)
期刊名:JPR 发表时间:(2019年12月) IF:3.780 单位:Grupo de Investigación de Reumatología (GIR), Unidad de Proteó ...
- Spring Data JPA 自定义对象接收查询结果集
Spring Data JPA 简介 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据库的访问和 ...
- echar图柱状图和折线图混合加双侧y轴坐
代码如下: floorSalesBar(){//方法名====这个方法应该放在methods中并在mounted中调用哦 methods let _this = this; let myChart = ...