一、定义

泛型是一种未知的数据类型,即当我们不知道该使用哪种数据类型的时候,可以使用泛型。

泛型的本质是为了  参数化 类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

在定义类或者方法或者接口的时候,是无法指定需要的参数类型的。这时候,我们需要将参数类型设置为一个参数。这就是所谓的参数化类型。

二、基本使用

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第十五天,泛型的更多相关文章

  1. “全栈2019”Java第九十五章:方法中可以定义静态局部内部类吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  2. “全栈2019”Java第十五章:Unicode与转义字符

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. “全栈2019”Java第二十五章:流程控制语句中循环语句while

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  4. 《Java编程思想》笔记 第十五章 泛型

    1 泛型 “泛型”意思就是适用于许多类型. 使用泛型的目的之一: 指定容器持有什么类型,让编译器确保正确性,而不是在运行期发现错误. 这个容器可以看成是有其他类型对象作为成员的类,而不单单只是JDK中 ...

  5. Java笔记(五)泛型

    泛型 一.基本概念和原理 泛型将接口的概念进一步延申,“泛型”的字面意思是广泛的类型. 类.接口和方法都可以应用于非常广泛的类型,代码与它们能够操作 的数据类型不再绑定到一起,同一套代码可以应用到多种 ...

  6. 菜鸟学Java(十五)——Java反射机制(二)

    上一篇博文<菜鸟学编程(九)——Java反射机制(一)>里面,向大家介绍了什么是Java的反射机制,以及Java的反射机制有什么用.上一篇比较偏重理论,理论的东西给人讲出来总感觉虚无缥缈, ...

  7. Java初学者笔记五:泛型处理

    一.泛型类: 泛型是指适用于某一种数据类型而不是一个数据机构中能存不同类型 import java.io.*; import java.nio.file.Files; import java.nio. ...

  8. java 深入技术五 (泛型)

    1.泛型概述 泛型的本质:参数化类型 定义 Object obj=new Object();//并不是所有类都可以使用泛型 List <String> list=new ArrayList ...

  9. Java笔记(十五)……面向对象IV多态(polymorphism)

    概述 定义:某一类事物的多种存在形态. 例:动物中猫,狗. 猫这个对象对应的类型是猫类型 猫 x = new 猫(); 同时猫也是动物中的一种,也可以把猫称为动物. 动物 y = new 猫(); 动 ...

随机推荐

  1. openstack的yum源出错,配置openstack-ocata版的在线yum源,openstack的yum源配置

    真的是几经周折,终于配置好了!我做好了一键配置yum的代码,地址:https://www.cnblogs.com/guarding/p/12321702.html 首先看一下配置前的报错信息把: 需要 ...

  2. LeetCode-矩形重叠

    题目描述: 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标. 如果相交的面积为正,则称两矩形重叠.需要明确的是,只在 ...

  3. 机器学习实战 [Machine learning in action]

    内容简介 机器学习是人工智能研究领域中一个极其重要的研究方向,在现今的大数据时代背景下,捕获数据并从中萃取有价值的信息或模式,成为各行业求生存.谋发展的决定性手段,这使得这一过去为分析师和数学家所专属 ...

  4. vscode 对于 md的编写 左侧 大纲 很重要!!

    vscode 对于 md的编写 左侧 大纲 很重要!!

  5. 使用docker构建hadoop集群

    docker的使用越来越普遍了,大家不知道docker的还需要进一步学习一下.这次咱们使用docker去进行hadoop集群的构建. 使用docker构建的好处真的很多,一台电脑上可以学习安装很多想做 ...

  6. DOTNET CORE源码分析之IOC容器结果获取内容补充

    补充一下ServiceProvider的内容 可能上一篇文章DOTNET CORE源码分析之IServiceProvider.ServiceProvider.IServiceProviderEngin ...

  7. 读书笔记——莫提默·J.艾德勒&查尔斯·范多伦(美)《如何阅读一本书》

    第一篇 阅读的层次 第一章 阅读的活力与艺术 阅读的目标:娱乐.获得资讯.增进理解力这本书是为那些想把读书的主要目的当作是增进理解能力的人而写.何谓阅读艺术?这是一个凭借着头脑运作,除了玩味读物中的一 ...

  8. Vue中使用echarts,ajax请求的远程数据赋值给图表不刷新的问题和解决办法

    问题: vue-cli搭建的项目,在mounted钩子函数里面创建echarts图表,本地模拟数据可以正常显示,但是当将ajax请求的远程数据赋值给图表时,图表并不会刷新. 解决办法: 刚开始以为是v ...

  9. Cisco 综合配置(一)

    要求: 1.内网所有PC及服务器都能访问外网 2.外网通过公网地址 202.101.100.3 访问内网服务器的Telnet服务 配置: PC.服务器都配置好自己的IP和默认网关:192.168.1. ...

  10. Volatile关键字回顾之线程可见性

    java中,volatile关键字有两大作用: 1.保证线程的可见性 2.防止指令重排序 这篇文章主要通过典型案例,体现可见性这一特性. 概念: java中,堆内存是线程共享的.而每个线程,都应该有自 ...