一、定义

泛型(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基础——泛型的更多相关文章

  1. 一天一个Java基础——泛型

    这学期的新课——设计模式,由我仰慕已久的老师传授,可惜思维过快,第一节就被老师挑中上去敲代码,自此在心里烙下了阴影,都是Java基础欠下的债 这学期的新课——算法设计与分析,虽老师不爱与同学互动式的讲 ...

  2. Java 基础 -- 泛型、集合、IO、反射

    package com.java.map.test; import java.util.ArrayList; import java.util.Collection; import java.util ...

  3. java基础-泛型举例详解

    泛型 泛型是JDK5.0增加的新特性,泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数.这种类型参数可以在类.接口.和方法的创建中,分别被称为泛型类.泛型接口.泛型方法. 一.认识泛型 在没 ...

  4. Java基础 - 泛型详解

    2022-03-24 09:55:06 @GhostFace 泛型 什么是泛型? 来自博客 Java泛型这个特性是从JDK 1.5才开始加入的,因此为了兼容之前的版本,Java泛型的实现采取了&quo ...

  5. java基础-泛型3

    浏览以下内容前,请点击并阅读 声明 8 类型擦除 为实现泛型,java编译器进行如下操作进行类型擦除: 如果类型参数有限制则替换为限制的类型,如果没有则替换为Object类,变成普通的类,接口和方法. ...

  6. java基础 泛型

    泛型的存在,是为了使用不确定的类型. 为什么有泛型? 1. 为了提高安全 2. 提高代码的重用率 (自动 装箱,拆箱功能) 一切好处看代码: package test1; import java.la ...

  7. java基础-泛型2

    浏览以下内容前,请点击并阅读 声明 6 类型推测 java编译器能够检查所有的方法调用和对应的声明来决定类型的实参,即类型推测,类型的推测算法推测满足所有参数的最具体类型,如下例所示: //泛型方法的 ...

  8. java基础-泛型1

    浏览以下内容前,请点击并阅读 声明 泛型的使用能使类型名称作为类或者接口定义中的参数,就像一般的参数一样,使得定义的类型通用性更强. 泛型的优势: 编译具有严格的类型检查 java编译器对于泛型代码的 ...

  9. Java基础---泛型、集合框架工具类:collections和Arrays

    第一讲     泛型(Generic) 一.概述 1.JDK1.5版本以后出现的新特性.用于解决安全问题,是一个类型安全机制. 2.JDK1.5的集合类希望在定义集合时,明确表明你要向集合中装入那种类 ...

随机推荐

  1. wpf 导出Excel

    private void Button_Click_1(object sender, RoutedEventArgs e) { ExportDataGridSaveAs(true, this.data ...

  2. 【转】Windows IIS注册asp 此操作系统版本不支持此选项 错误解决方法

    原文:https://blog.csdn.net/sweety820/article/details/79538973 更新Win10,原来的IIS站点访问不了,原因是因为IIS 没有.net 4.5 ...

  3. 【转】ABP webapi三种方式

    作者:圣杰 链接:https://www.jianshu.com/p/d14733432dc2 來源:简书 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 1. 引言 上一节我们 ...

  4. 【sping揭秘】9、容器内部事件发布(二)

    写在前面---------------------------------- 命运多舛,痴迷淡然 不知下一步该往哪里走,现在应该是我的迷茫期... 加油,快点走出去!!! 聪明的网友们,你们有没有迷茫 ...

  5. Django url分发器

    视图: 视图一般都写在app的views.py中.并且视图的第一个参数永远都是request(一个HttpRequest)对象.这个对象存储了请求过来的所有信息,包括携带的参数以及一些头部信息等.在视 ...

  6. Servlet各种路径、URL配置分析

    大家都知道,Servlet有个配置: <servlet> <servlet-name>zolltyMVC</servlet-name> <servlet-cl ...

  7. 集合框架_DAY15

    1:集合(掌握) (1)集合的由来 我们需要对多个对象进行存储和获取.可以使用对象数组.但是,如果对象的个数是变化的,对象数组就解决不了了.怎么办呢?java就提供了集合类解决. (2)集合和数组的区 ...

  8. JVM(一)JVM的概述与运行流程

    1.基本概念 JVM和普通虚拟机: 大家常用的两种虚拟机是VMWare和Visual Box,用来操作cpu指令. JVM是程序自己独立的运行环境,对堆栈.寄存器.字符码指令等操作. Java.JRu ...

  9. IDEA中Git的使用基础

    场景概述 工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程Git仓库上获取项目源码 ...

  10. docker namespaces

    https://docs.docker.com/engine/security/userns-remap/#prerequisites 注:以下验证环境为centos7.5 docker 18.09. ...