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; // Illegalpublic static void Example2(E o1) { // Illegal }static {E Example3; // Illegal } }
转载于:https://www.cnblogs.com/1693977889zz/p/7095460.html
Java基础——泛型相关推荐
- Java基础 --- 泛型 Generics
Java基础 --- 泛型 Generics 为什么需要泛型 泛型 Bounds for Type Variable Java虚拟机如何处理泛型 --- 泛型擦除 Restrictions and L ...
- java基础-泛型举例详解
泛型 泛型是JDK5.0增加的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数.这种类型参数可以在类.接口.和方法的创建中,分别被称为泛型类.泛型接口.泛型方法. 一.认识泛型 在没 ...
- java 基础 泛型
泛型是什么? 泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参.那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类 ...
- Java基础----泛型
一,泛型机制介绍及为何要使用泛型 泛型机制是在Java SE5.0中增加的,使用泛型机制编写的程序代码要比那些杂乱地使用object变量,然后再进行强制转换的代码具有更好的安全性和可读性.泛型对于集合 ...
- Java基础—泛型的使用(详细)
文章目录 目录 零.概念 一.泛型的优点 1.1优点 1.2为什么要使用泛型 二.泛型使用与不使用的区别 1.泛型的没有使用会造成什么后果呢? 2.添加泛型的使用会发生什么效果呢? [一.二] 知识点 ...
- [Java基础]泛型基础
可变参数的使用: 代码如下: package CanChangePack;import java.util.Arrays; import java.util.List;public class Arg ...
- 六、JAVA基础--泛型
泛型方法:泛型方法可以放在普通类中,也可以定义在泛型类中. <T extends 具体类或者接口> T为绑定类型的子类型:T和绑定类型可以是类,也可以是接口. 可以有多个限定类型,用'&a ...
- java 获取泛型t的class_阿里巴巴都鼎力推荐的java基础之集合其他内容和泛型3
第三节 泛型 3.1为什么需要泛型 没有采用泛型之前 1.不安全:添加元素是无检查 宽进 2.繁琐:获取元素时需要强制类型转换 严出 采用泛型之后 1.安全 严进 2.简单 宽出 3.2什么是泛型ge ...
- Java基础-我所理解的泛型
Java基础-我所理解的泛型 引用 [java]泛型中,? extends T 与 ? super T 的区别.看法_winrh的博客-CSDN博客_泛型 extends 前言 Java基础系列,我所 ...
- Java编程基础 - 泛型
Java编程基础 - 泛型 [导读] . 什么是泛型 一般传统而言,泛型允许程序员在强类型语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型. 编程技术发展至今很多语言,尤其是强 ...
最新文章
- TensorFlow指定CPU和GPU方法
- 操作系统学习:Linux0.12初始化详细流程-进程1调度与读取硬盘数据
- 基于JavaWeb实现就业管理系统
- JavaScript实现countSetBits设置位的数量算法(附完整源码)
- Kafka Without ZooKeeper ---- 不使用zookeeper的kafka集群
- 窗体案例:注册 登陆 主界面 c# 1613533126
- linux操作系统说课稿,信息技术《揭开LINUX的神秘面纱》教案范文
- 批量删除和修改特定前缀的mysql表
- NBU 备份 SAP HANA
- vue制作圆形进度条
- 狗头人与地下世界冒险模式通关记录 [20171224]
- C语言结构体struck所占用的字节数如何计算
- MATLAB中图像模式转换
- LeetCode.623 Add One Row to Tree
- Chromedriver Mirror
- 网页小图标和文字混排时如何对齐基准线
- 【锁】悲观锁与乐观锁实现
- JQuery效果动画
- Linux之基础命令
- Shell编程-02-正则表达式