一、定义

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

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

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

二、基本使用

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. 从源码看 PHP 7 数组的实现

    本文所用源码为 PHP 7.4.4 的版本. PHP 7 数组概述 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.此类型在很多方面做了优化,因此可以把它当 ...

  2. JSTL、请求转发和URL重定向

    JSTL 为什么要使用JSTL? 因为在JSP中写JAVA代码很麻烦,而JSTL可以简化在JSp中写JAva代码的流程 如何使用JSTL? 准备工作: ①将JSTL依赖的jar包导入工程的WEB-IN ...

  3. Natas30 Writeup(sql注入)

    Natas30: 本关是一个登录页面,查看源码,可以发现关键代码. if ('POST' eq request_method && param('username') &&am ...

  4. Python基础 | 数据文件的读写

    目录 txt txt的读入 txt的写出 csv xls\xlsx 在线网页数据 常用的工具 爬虫的步骤 pdf pdfrw PyPDF2 提取文档信息 word文档 其他统计软件生成文件 本文总结使 ...

  5. 2020年Java基础高频面试题汇总(1.4W字详细解析)

    1. Java语言有哪些特点 (1)简单易学.有丰富的类库 (2)面向对象(Java最重要的特性,让程序耦合度更低,内聚性更高) (3)与平台无关性(JVM是Java跨平台使用的根本) (4)可靠安全 ...

  6. Python异常处理,将异常写入到一个文件

    '''定义一个函数func(urllist) urllist:为URL的列表,例如:['http://xx.com','http://www.xx.com','http://www.xxx.com'. ...

  7. Contest 158

    2019-10-14 15:30:38 总体感受:这次依然很快搞定了前三题,最后一题乍看之下还是比较简单的,但是出奇多的corner case让我非常苦恼,这也让我意识到要想真正征服最后一题,还有一个 ...

  8. [JVM教程与调优] JVM都有哪些参数类型?

    JDK本身是提供了一些监控工具,有一些是命令行,也有图形界面.本次介绍命令行如何进行监控. 命令行是非常重要的,因为在我们生产环境基本上是没有图形界面的,完全是通过命令行. 主要内容: JVM的参数类 ...

  9. POJ 1062 昂贵的聘礼 最短路+超级源点

    Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低 ...

  10. Tensorboard详解(下篇)

    间提壶华小厨 1 Tensorflow监控指标可视化 除了GRAPHS栏目外,tensorboard还有IMAGES.AUDIO.SCALARS.HISTOGRAMS.DISTRIBUTIONS.FR ...