泛型Genericity
泛型:可以在类或方法中预支地使用未知的类型。
注意: 一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。
| E - Element | (在集合中使用,因为集合中存放的是元素) * |
| T - Type | (Java 类) |
| K - Key | (键) |
| V - Value | (值) |
| N - Number | (数值类型) |
定义泛型:
编写的类,或者方法上, 灵活性更高, 类操作的数据类型不在由编写者确定, 预知未知的数据类型,
当使用者创建这个类的对象的时候, 由使用者根据他的需求, 确定数据类型不使用Object,
1. 获取数据, 返回的Object类型, 需要进行类型转换, 可能出现ClassCastException
2. 实际中, 集合操作的一组数据, 数据类型都是一样
【注意点】
1.对象实例化时不指定泛型,默认为:Object。
2.泛型不同的引用不能相互赋值。
3.加入集合中的对象类型必须与指定的泛型类型一致。
4.静态方法中不能使用类的泛型。
5.如果泛型类是一个接口或抽象类,则不可创建泛型
类的对象。
6.不能在catch中使用泛型
7.从泛型类派生子类,泛型类型需具体化
泛型的定义:
1. 在类上定义泛型
2. 在方法上定义泛型
3. 在接口上定义泛型
类中的泛型
public class GenericDemo1<T>{
//在类中使用这个泛型变量, 属性的数据类型
// 返回的返回值, 返回的参数
//定义一个属性
private T info; // 属性的数据类型: T的是什么. 数据类型就是什么
//在方法上使用, 使用泛型变量作为返回值类型
public T fun1(){
return info;
}
//在方法的参数上使用
public void fun2(T param){
System.out.println("我是fun2()方法, 我的参数是:"+param);
}
}
方法中的泛型
public class GenericDemo2 {
//在方法上声明泛型
public <T> String fun1(T t){
return "fun1";
}
// 静态方法上使用泛型, 声明泛型变量, <E> 写static后面
public static <E> void fun3(E str){
}
// public void fun2(T t){ 错误
//
// }
}
接口中的泛型
//泛型接口
public interface GenericInterface<E> { public void fun1(E e);
} //实现类一
//实现类, 给接口的泛型变量赋一个数据类型: String
public class GenericInterfaceImpl implements GenericInterface<String>{ @Override
public void fun1(String e) { } } //实现类二
// 子类(子接口) 变成一个泛型类
public class GenericInterfaceImpl2<E> implements GenericInterface<E> { @Override
public void fun1(E e) { } public static void main(String[] args) {
//创建对象:
GenericInterfaceImpl2<String> gi = new GenericInterfaceImpl2<>();
gi.fun1("haha"); } }
泛型通配符 ?
public class Genericity_? {
public static void main(String[] args) {
//使用泛型创建list
List<String> list=new ArrayList<>();
list.add("abc");
list.add("abb");
list.add("cba");
List<Integer> list1=new ArrayList<>();
list1.add(123);
list1.add(234);
list1.add(456);
//调用打印list方法
printList(list);
printList(list1);
// 这个方法 接收任意的数据类型元素的 List集合, 有一个警告, 参数List 使用泛型
// List<String> 但是list只能接收 元素是String的List集合
// List<Object> 注意: 泛型中,没有继承的关系 List<Object> list = new ArrayList<String>(); 错误
// 泛型变量
// ? 代表泛型变量是任意数据类型, 只能接收数据, 不能存储数据
// 限制? 范围 ? extends 类名A 上限 传递的数据类型 A类或者是A类的子类 理解
// ? super 类名A 下限: 传递的数据类型 A类或者A类的父类
}
//打印list方法
public static void printList(List<?> list){// <? super Number> <? extends Number>
System.out.println(list);
}
}
泛型Genericity的更多相关文章
- Introduction of OpenCascade Foundation Classes
Introduction of OpenCascade Foundation Classes Open CASCADE基础类简介 eryar@163.com 一.简介 1. 基础类概述 Foundat ...
- 6.Swift协议|扩展|访问权限|异常调试|类型转换|运算函数|ARC|类类型初试化器|值类型初始化器
1. 协议(Protocol):与OC之间唯一不同的是Swift中的协议不管是属性还时方法全部是必须实现的 /** protocol*/ protocol FullNamed { /** 计算属性申明 ...
- Introduction of Open CASCADE Foundation Classes
Open CASCADE Foundation Classes Open CASCADE基础类 eryar@163.com 一.简介 1. 基础类概述 Foundation Classes Overv ...
- Java1.5泛型指南中文版(Java1.5 Generic Tutorial)
Java1.5泛型指南中文版(Java1.5 Generic Tutorial) 英文版pdf下载链接:http://java.sun.com/j2se/1.5/pdf/generics-tutori ...
- Java基础学习-泛型概述和测试
1.举例 首先先用集合来写个自定义对象存储并且去遍历. package genericity; import java.util.ArrayList; import java.util.Collect ...
- 泛型&&枚举
1.枚举类型 JDk1.5中新增了枚举类型,可以使用该功能取代以往定义常量的方式,同时枚举类型还赋予程序在编译时进行检查的功能. 1.1 使用枚举类型设置常量 以往设置常量,通常将常量放在接口中(fi ...
- Java Genericity
四. Java Genericity 1. Genericity 泛型 泛型 <T> 1. 泛型就是参数化类型 2. 作用:安全,方便 3. 适用于对多种数据类型执行相同功能的代码,主 ...
- JAVA泛型知识(一)
Java泛型知识(二)<? extends T>和<? super T> Java1.5泛型指南中文版(Java1.5 Generic Tutorial) 目 录 ...
- Java系列之泛型
自从 JDK 1.5 提供了泛型概念,泛型使得开发者可以定义较为安全的类型,不至于强制类型转化时出现类型转化异常,在没有反省之前,可以通过 Object 来完成不同类型数据之间的操作,但是强制类型转换 ...
随机推荐
- 关于css 的垂直居中
对于元素的水平居中,我根据我自己之前的一些学习来进行一些总结,如果有不对的地方,欢迎指正~ 一.让大小不固定的元素垂直居中 因为:表格的单元格的特别属性:垂直居中等: `div.parent { di ...
- Python爬虫 - UserAgent列表
PC端: PC_USER_AGENT = [ 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)', 'Mozilla/4.0 (compatibl ...
- Python3基础语法和数据类型
Python3基础语法 编码 默认情况下,Python3源文件以UTF-8编码,所有字符串都是unicode字符串.当然你也可以为原码文件制定不同的编码: # -*- coding: 编码 -*- 标 ...
- 树莓派3b+ 交叉编译 及升级 kernel
安装 gcc pkg 等工具sudo apt-get install build-essential git 官方介绍 https://www.raspberrypi.org/documentatio ...
- RTOS文件系统对比:LittleFS Vs. SPIFFS
概述 在RTOS上免费的文件系统本身就不多,广泛使用且掉电安全的就更少了.本文选取当前RTOS上比较受欢迎的两个文件系统 SPIFFS 和 LittleFS 做全方位的对比,以便项目上评估在RTOS上 ...
- MATLAB神经网络(5) 基于BP_Adaboost的强分类器设计——公司财务预警建模
5.1 案例背景 5.1.1 BP_Adaboost模型 Adaboost算法的思想是合并多个“弱”分类器的输出以产生有效分类.其主要步骤为:首先给出弱学习算法和样本空间($X$,$Y$),从样本空间 ...
- 用Setuptools构建和分发程序包
目录 使用Setuptools构建和分发软件包 开发人员指南 安装setuptools 基本使用 指定项目的版本 新增和更改的setup()关键字 包括数据文件 参考示例 使用Setuptools构建 ...
- debug.js在手机上打印调试信息
在做移动端开发的时候大家应该都遇到过这么一个问题:如何在手机上打印调试信息? 在pc端我们通常会用console.log 或者 alert,但大家知道console.log在手机上是看不到打印信息的: ...
- 解开Service Mesh的神秘面纱
一.什么是Service Mesh? 下面是 Willian Morgan 对 Service Mesh 的解释: A Service Mesh is a dedicated infrastructu ...
- Mybatis总结一之SQL标签方法
---恢复内容开始--- 定义:mapper.xml映射文件中定义了操作数据库的sql,并且提供了各种标签方法实现动态拼接sql.每个sql是一个statement,映射文件是mybatis的核心. ...