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的集合类希望在定义集合时,明确表明你要向集合中装入那种类 ...
随机推荐
- Python zip() 与 map()的用法
zip(): 将多个可迭代对象按序取出相同索引的元素(当长度最小的对象为准), 组成一个个元组,并封装在一个可迭代对象中 a = [1, 2, 3, 4] b = [5, 6, 7, 8] c = z ...
- 读书笔记--SQL必知必会--常用MySQL(MariaDB)命令及示例
DBMS信息 显示DBMS的版本 select version(); 显示DBMS状态 status; 显示DBMS资源状态 show status; 显示DBMS支持的权限 show privile ...
- String s=“dd”和String s=new String("dd")区别
Java中String s="dd"的话会先检查常量池中是否有"dd"这个字符串,如果没有则创建一个,然后将s指向字符串的地址,而new String(&quo ...
- [LeetCode]138复制带随机指针的链表
题目描述: 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深度拷贝. 思路: 先遍历链表,将每个节点对应的随机指针指向的对象利用Hash ...
- [Umbraco] document type里的父节点与子节点的设置
虽然我们不能像做数据库设计那样建立主外键关系.但我们建立xml里父子关系,父子关系其实是指是否允许在一个页面(如频道,分类,栏目等)下创建子页面,这就相当于建立站点的树状结构,对于筛选数据会有很大的作 ...
- odoo开发笔记--自定义server action页面跳转注意
场景描述: 在添加自定义服务器动作 “复制全部”后发现直接创建了新的记录,并且直接进入到form保存完的状态. 如何解决: if yourself_obj_copy: return { 'type': ...
- sql server 2012 打开提示无效的许可证数据。需要重新安装
重装什么的没有用,需要下载Visual Studio 2010 Isolated Shell (zh-CN) ,重新安装后就好了 下载地址 Visual Studio 2010 Isola ...
- Java代码操作HDFS测试类
1.Java代码操作HDFS需要用到Jar包和Java类 Jar包: hadoop-common-2.6.0.jar和hadoop-hdfs-2.6.0.jar Java类: java.net.URL ...
- CentOS7下RabbitMQ服务安装配置
参考文档: CentOS7下RabbitMQ服务安装配置 http://www.linuxidc.com/Linux/2016-03/129557.htm 在linux下安装配置rabbitMQ详细教 ...
- VisualVM + BTrace
VisualVM下载地址:http://visualvm.github.io/download.html 解压后打开bin目录下的visualvm.exe 选择Tool-->Plugins,选择 ...