一、定义

泛型(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. 一些小案例_C#

    下面是一些小的案例.(C#) 1,求一段数第n位 //1 1 2 3 5 8 求30位 //规律是前两位之和是第三位数, ;//定义第一位 ;//定义第二位 ;//总和 ; i < ; i++) ...

  2. 开源 PetaPoco 扩展~一个小型轻巧的ORM~

    PetaPoco http://www.toptensoftware.com/petapoco/ |PetaPoco is a tiny, fast, single-file micro-ORM fo ...

  3. 【转】C#中Serializable序列化实例详解

    这篇文章主要介绍了C#中Serializable序列化,以实例形式详细讲述了系列化的技术及各种序列化方法,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了C#中Serializable序列化.分 ...

  4. Unity C# .Net List 优化点

    Unity C# .Net List 优化点 已知长度 则初始化指定长度 调用多次Remove会导致内存浪费 调用TrimExcess释放多余内存 List代码实现原理 使用数组保存泛型数据 代码 L ...

  5. Jenkins配置项目

    前提:服务器上部署了jenkins+Tomcat,并且安装了所需插件 1.新建项目 -- 项目配置 2.配置git地址 出现上述错误是因为该git地址,在jenkins服务器上无权限访问.在git上开 ...

  6. 以太坊ERC20代币合约案例

    一.ERC20代币合约与web3调用 ERC20代币合约在小白看来觉得很高大上,但其实就是一个代币的定义标准,方便其他dapp统一调用各种代币的方法.如图: 二.ERC20合约标准 [官方链接] co ...

  7. 使用makefile

    最近在学习一个处理二维相场问题的c++程序,遇到了makefile文件,之前没有接触过,这里做一个简单的整理. 什么是makefile? 大多程序员使用的windows操作系统,IED都完成了make ...

  8. .Net 鉴权授权

    在这里总结一下工作中遇到的鉴权和授权的方法 ① 固定token的方案 通过在nginx或者代码中写死token,或者通过在限制外网访问的方式已来达到安全授权的方式 ② session方案 分布式会话方 ...

  9. Install vsftpd on centos

    安装vsftpd程序. sudo yum -y install vsftpd 启动ftp服务. sudo service vsftp start 添加ftp用户,并设置密码. sudo useradd ...

  10. c# winform as3相互调用

    C#主要代码: 首先要添加COM组件-Shockwave Flash Object //接收flash发送过来的信息        private void axShockwaveFlash1_Fla ...