IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java学习记录10——泛型 -> 正文阅读

[Java知识库]Java学习记录10——泛型

一、泛型

1.基本介绍

传统方法向集合中添加对象不能对加入到集合中的数据进行约束(不安全)。数据存入时要转成Object,遍历时需要进行类型转换(向下转型),如果集合中数据量较大,对效率有影响。因此引出泛型——可接受数据类型的类型。

语法:
interface 接口名<T> {}class 类名<k,v,…> {}
T、K、V都代表数据类型,且必须为引用类型,不能为基本数据类型
一般在创建具体对象时将泛型实例化

  1. 泛型又称参数化类型,是jdk5.0出现的新特性,解决数据类型的安全性问题
  2. 在类声明或实例化时只要指定好需要的具体类型即可,传入的类型要求为指定类型或指定类型的子类。如果不写,则泛型默认是Object
  3. Java泛型可以保证如果程序在编译时没有发出警告,在运行时就不会产生ClassCastException异常,同时使代码更加简介、健壮
ArrayList<MyDate> myDates = new ArrayList<>();//往往简写,省略后面的,编译器会进行类型推断
myDates.add(new MyDate(2003,1,1));
myDates.add(new MyDate(2000,1,1));
//myDates.add(new UsDate(1344,1,1)); 报错,与泛型类型不符
for (MyDate date : myDates) {//不需转型,直接以MyDate类对象接受并遍历
	System.out.println(date);
}

2.作用与优点

泛型的作用:可以在类声明时通过一个标识,表示类中某个属性的类型,或某个方法的返回值类型/参数类型

public class Test {
    public static void main(String[] args) {
		Person<String> person = new Person<String>("Curry");//相当于用String代替E类型
}
class Person<E> {
	E s;//E表示s的数据类型,该数据类型在定义Person对象时指定,即在编译期间,就确定了E是什么类型
	public Person(E s) {//E也可是参数类型
		this.s = s;
	}
	public E f() {//E也可是返回值类型
		return s;
	}
}

泛型的优点:

  1. 编译时检查添加元素的类型,提高了安全性
  2. 遍历时不需转换类型,减少了类型转换的次数,提高效率
  3. 不会提示编译警告

二、自定义泛型

1.自定义泛型类

class 类名<T,R…> { 成员 }T,R为泛型标识符,一般为单个大写字母,可以有多个。

PS:

  1. 普通成员可以使用泛型(属性、方法)
  2. 使用泛型的数组不能初始化(因为数组在new时不能确定泛型T的类型,就无法在内存开辟空间)
  3. 静态方法中不能使用类的泛型(因为静态是和类相关的,在类加载时,对象还未创建。而泛型要在对象创建时指定类型)
  4. 泛型类的类型是在创建对象时确定的
  5. 如果在创建对象时,没有指定类型,则默认为Object
//自定义泛型类
class Person<T,R,M> {
	R r;//属性使用泛型
	M m;
	T t;
	//T[] ts = new T[6]; 报错,不能初始化
	public Person(R r,M m,T t) {//构造器使用泛型
		this.r = r;
		this.m = m;
		this.t = t;
	}
	public M f() {
		return m;
	}
}

2.自定义泛型接口

interface 接口名<T,R…> { 成员 }

PS:

  1. 接口中,静态成员也不能使用泛型(同泛型类)
  2. 泛型接口的类型,在继承接口实现接口时确定
  3. 没有指定类型,则默认为Object
interface Iusb<U,R> {
	//U name; 接口中属性为静态,不能使用泛型
	R get(U u);//普通抽象方法中使用接口泛型
	void hi(R r);
	void run(R r1,R r2,U u1,U u2);
	//jdk8.0中,可以在接口中使用默认方法,也可使用泛型
	default R method(U u) {
		return null;
	}
}
interface IA extends Iusb<String,Double> {
	//继承接口时就可指定泛型U、R的类型
}
class AA implements IA {
	//实现IA中继承自Iusb的抽象方法
	//实现时会IDE自动填充IA中指定的类型
}
class BB implements Iusb<String,Double> {
//实现接口时指定泛型类型
	//实现Iusb的抽象方法
	//实现时会IDE自动填充BB中指定的类型
}

2.自定义泛型方法

修饰符 <T,R>返回类型 方法名(参数列表) { }泛型提供给方法使用

PS:

  1. 泛型方法可以定义在普通类,也可定义在泛型类中
  2. 当泛型方法被调用时传入参数,编译器会确定类型
  3. 泛型方法可以使用类声明的泛型,也可使用自己声明的泛型
  4. public void eat(E e) {};修饰符后没有<>,eat方法不是泛型方法,而是使用了类声明泛型

三、泛型继承和通配符

泛型不具备继承性

通配符:

  1. <?> 支持任意泛型类型
  2. <? extends A>支持A类以及A类的子类,规定了泛型的上限
  3. <? super A>支持A类以及A类的父类,不限于直接父类,规定了泛型的下限
public static void printCollection(List<?> c) {//通配符接受任意泛型
	for (Object object : c) {//取出时就是Object
		System.out.println(object);
	}
}

JUnit单元测试

一个类有很多功能代码需要测试,为了测试就要写入到main方法中,如果有多个功能代码测试,就需要来回注销,切换很麻烦。

JUnit是一个Java语言的单元测试框架,多数Java开发环境都集成了JUnit作为单元测试的工具。
JUnit可直接运行一个方法,并返回相关信息

alt + enter 添加JUnit5.4到类路径
在这里插入图片描述
完成后可在@Test下的方法处直接进行单独测试运行
在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 16:04:04  更:2022-04-06 16:04:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:56:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码