Java基础——泛型
一、定义
泛型(generic)是指参数化类型的能力。可以定义带泛型类型的类或方法,随后编译器会用具体的类型来替换它(泛型实例化)。使用泛型的主要优点是能够在编译时,而不是在运行时检测出错误。它是jdk1.5之后出现的特性,为了增强安全性。我的理解是,它更像一种特殊规范,比如程序员在调用的时候,或者客户端在引入的时候,总不能鱼龙混杂,想怎样就怎样啊?!前面定义说输入一个String型的,这边再不听话,没必要让你执行下去了,就直接让你挂掉。
二、未定泛型的坏处
1.报警告, 没有进泛型参数化
2.不定义泛型,集合里可以装入任何类型的对象,这是不安全的
3.取集合中的数据的时候,要进行强转
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet; public class Test {
public static void main(String[] args) {
Set treeSet = new TreeSet();//没有使用泛型,应该这样:Set<Student> treeSet = new TreeSet<Student>(); treeSet.add(new Student(11, 80, "李平"));
treeSet.add(new Student(23, 40, "王芳"));
treeSet.add(new Student(10, 60, "赵磊"));
treeSet.add(new Student(12, 40, "王小二"));
treeSet.add(new Student(10, 60, "马苗"));
treeSet.add(new Student(18, 60, "马苗"));
treeSet.add(new Student(25, 70, "姜浩")); Iterator it = treeSet.iterator();
while (it.hasNext()) {
Student stu = (Student) it.next();//没有使用泛型:需要强转
System.out.println(stu);
} }
}
编译时开始报错(黄色):

修改之后:

注意:泛型类型必须是引用类型!!!
注意:泛型类型必须是引用类型!!!
注意:泛型类型必须是引用类型!!!
三、泛型的制定
在JDK中我们经常看见如下的三种情况:

1.TreeSet(Collection<? extends E> c)
2.TreeSet(Comparator<? super E> comparator)
3.TreeSet(SortedSet<E> s)
其中,
? 通配符,指的是任意数据类型
< > 指的是泛型。(可以看出,3 就是正常定义泛型)
下面的注意:
泛型的限定上限:<? extends E > // 表示接收E这个类型,或E的子类型
泛型的限定下限 :<? super E > // 表示接收E这个类型,或E的父类型
代码实例:
//这时这个函数只能接收 Number及其子类
static void show(Point<? extends Number> p){
System.out.println(p.getX());
System.out.println(p.getY());
} public static void main(String[] args) {
/* 对于上面的声明,下面的操作是可以的
Point<Integer> p1=new Point<Integer>();
p1.setX(new Integer(90));
p1.setY(new Integer(50));
show(p1); */ //下面的操作将出错
Point<String> p1=new Point<String>();
p1.setX("90ok");
p1.setY("50ok");
show(p1); //出错
class Test7{
//这时这个函数只能接收 Number及其子类
static void show(Point<? super String> p){
System.out.println(p.getX());
System.out.println(p.getY());
}
public static void main(String[] args) {
/*
这里将出错
Point<Integer> p1=new Point<Integer>();
p1.setX(new Integer(90));
p1.setY(new Integer(50));
show(p1); */
Point<String> p1=new Point<String>();
p1.setX("90ok");
p1.setY("50ok");
show(p1); //可以
}
}

(图片来自网络)
四、理解泛型的应用
我们可以自定义泛型类,泛型方法和泛型接口。学习的时候需要知道它的原理,以后就可以愉快的调用JDK里面的啦~~
1.自定义泛型类
class ObjectFactory<T> { // 声明泛型為<T>
private T obj;
public T getObj() {
return this.obj;
}
public void setObj(T obj) {
this.obj = obj;
}
/*
* 下面的写法不成立 public T getNewObj(){ T t=new T(); //在编译期,无法确定泛型的参数化的类型 return
* t; }
*/
}
class Test4 {
public static void main(String[] args) {
// List list=new ArrayList();
/*
* ObjectFactory f=new ObjectFactory(); f.SetObj("ss");
*/
ObjectFactory<String> f = new ObjectFactory<String>();
f.setObj("这里必须是String");
// f.SetObj(89); 不可以
String obj = f.getObj();
System.out.println(obj);
ObjectFactory<Student> stuList = new ObjectFactory<Student>();
stuList.setObj(new Student(67, 90, "张三"));
stuList.getObj().speak();
}
}
2.泛型方法
public class TestFan {
// 泛型方法,这里不做限制,传什么都可以
public <T> void show(T t) {
System.out.println("这是泛型方法中的" + t);
}
}
class Test5 {
public static void main(String[] args) {
TestFan tfan = new TestFan();
tfan.show("777");
tfan.show(898);
tfan.show(new Student(30, 20, "猫"));
}
}
3.泛型接口

五、泛型限制
1.不能使用泛型参数创建实例,即不能使用new E()
2.异常类不能是泛型的
3.在静态环境下不允许类的参数是泛型类型(注意)
由于泛型类的所有实例都有相同的运行时类,所以泛型类的静态变量和方法是被它的所有实例所共享的。既然是共享的你就没有必要再重新定义一样的泛型类型,那如果你不定义一样的泛型类型,又达不到共享(或者说是一致性),更没有必要让这种情况通过。所以,在静态环境了类的参数被设置成泛型是非法的。
public class Ee<E> {
public static E Example1; // Illegal
public static void Example2(E o1) {
// Illegal
}
static {
E Example3; // Illegal
}
}
Java基础——泛型的更多相关文章
- 一天一个Java基础——泛型
这学期的新课——设计模式,由我仰慕已久的老师传授,可惜思维过快,第一节就被老师挑中上去敲代码,自此在心里烙下了阴影,都是Java基础欠下的债 这学期的新课——算法设计与分析,虽老师不爱与同学互动式的讲 ...
- Java 基础 -- 泛型、集合、IO、反射
package com.java.map.test; import java.util.ArrayList; import java.util.Collection; import java.util ...
- java基础-泛型举例详解
泛型 泛型是JDK5.0增加的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数.这种类型参数可以在类.接口.和方法的创建中,分别被称为泛型类.泛型接口.泛型方法. 一.认识泛型 在没 ...
- Java基础 - 泛型详解
2022-03-24 09:55:06 @GhostFace 泛型 什么是泛型? 来自博客 Java泛型这个特性是从JDK 1.5才开始加入的,因此为了兼容之前的版本,Java泛型的实现采取了&quo ...
- java基础-泛型3
浏览以下内容前,请点击并阅读 声明 8 类型擦除 为实现泛型,java编译器进行如下操作进行类型擦除: 如果类型参数有限制则替换为限制的类型,如果没有则替换为Object类,变成普通的类,接口和方法. ...
- java基础 泛型
泛型的存在,是为了使用不确定的类型. 为什么有泛型? 1. 为了提高安全 2. 提高代码的重用率 (自动 装箱,拆箱功能) 一切好处看代码: package test1; import java.la ...
- java基础-泛型2
浏览以下内容前,请点击并阅读 声明 6 类型推测 java编译器能够检查所有的方法调用和对应的声明来决定类型的实参,即类型推测,类型的推测算法推测满足所有参数的最具体类型,如下例所示: //泛型方法的 ...
- java基础-泛型1
浏览以下内容前,请点击并阅读 声明 泛型的使用能使类型名称作为类或者接口定义中的参数,就像一般的参数一样,使得定义的类型通用性更强. 泛型的优势: 编译具有严格的类型检查 java编译器对于泛型代码的 ...
- Java基础---泛型、集合框架工具类:collections和Arrays
第一讲 泛型(Generic) 一.概述 1.JDK1.5版本以后出现的新特性.用于解决安全问题,是一个类型安全机制. 2.JDK1.5的集合类希望在定义集合时,明确表明你要向集合中装入那种类 ...
随机推荐
- winform自动升级方案
未涉及过winform升级,研究一阵,大致出来个不成熟的方案. 我的解决方案(判断升级,升级程序下载安装包的压缩包,解压,自动安装,重新启动程序). 1.首先根据服务器中软件版本号和本地软件版本号是否 ...
- 【UOJ244】 【UER #7】短路(贪心)
传送门 uoj Solution 简单题? 考虑一条路径长什么样子,一定是经过某一个字母环的左上角,那么答案就很简单了. 我们记一个前缀最小值,这样子让他一路走下去一定是最优! 然后扫一遍就好了. 代 ...
- 多项式&生成函数(~~乱讲~~)
多项式 多项式乘法 FFT,NTT,MTT不是前置知识吗?随便学一下就好了(虽然我到现在还是不会MTT,exlucas也不会用) FTT总结 NTT总结 泰勒展开 如果一个多项式\(f(x)\)在\( ...
- Nmap命令的常用实例
一.Nmap简介 nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端.确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting).它是网络管 ...
- Akka(42): Http:身份验证 - authentication, authorization and use of raw headers
当我们把Akka-http作为数据库数据交换工具时,数据是以Source[ROW,_]形式存放在Entity里的.很多时候除数据之外我们可能需要进行一些附加的信息传递如对数据的具体处理方式等.我们可以 ...
- DockerFile(保你会版本)(七)
一.什么是dockerfile Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile自定义快速创建属于自己的镜像,Dockerfile是通过很多的参数指令编写的文件,通过do ...
- java中result和resultSet
ResultSet: 1,定义 public interface ResultSet 表示数据库结果集的数据表,通常通过执行查询数据库的语句生成. 2,获得 State ...
- odoo开发笔记 -- 安装Backend debranding去除odoo信息模块后 隐藏开发者模式
Backend debranding 找到如下文件,将相关灰色代码注释掉. <?xml version="1.0" encoding="UTF-8"?&g ...
- 跨站脚本攻击(xss)理解
一 概念 攻击者不直接攻击受害者,而是利用受害者登陆的网站中的漏洞,对受害者进行攻击. 二 危害 由于js本身的限制,并不能直接对用户的电脑造成侵害,但是可以: 1. 获取用户的storage,c ...
- 课程二(Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization),第三周(Hyperparameter tuning, Batch Normalization and Programming Frameworks) —— 2.Programming assignments
Tensorflow Welcome to the Tensorflow Tutorial! In this notebook you will learn all the basics of Ten ...