规则和限制

1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。

2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。

3、泛型的类型参数可以有多个。

4、泛型的参数类型可以使用extends语句,例如。习惯上称为“有界类型”。

5、泛型的参数类型还可以是通配符类型。例如Class> classType = Class.forName("java.lang.String")。

限制泛型

我们一般是这样定义泛型的:class Generics,实际上这里的限定类型相当于Object,这和“Object泛型”实质是一样的。什么是限制比如我们要限制T为集合接口类型。只需要这么做:class Generics,这样类中的泛型T只能是Collection接口的实现类,传入非Collection接口编译会出错。

注意:这里的限定使用关键字extends,后面可以是类也可以是接口。但这里的extends已经不是继承的含义了,应该理解为T类型是实现Collection接口的类型,或者T是继承了XX类的类型。

public class CollectionGen {

private T t;

public CollectionGen(T t) {

this.t = t;

}

public T getT() {

return t;

}

public void setT(T t) {

this.t = t;

}

public static void main(String args[]) {

CollectionGen genList = null;

genList = new CollectionGen(new ArrayList());

//以下代码不能通过编译

//      CollectionGen genCollention = null;

//      genCollention=new CollectionGen(new ArrayList());

System.out.println("可以编译通过并运行!");

}

}

上面的代码是可以编译通过并成功运行的。但是打开注释掉的两行就出错了,因为这么定义类型的时候,就限定了构造此类实例的时候T是确定的一个类型,这个类型实现了Collection接口。简单一句话就是:上面这种方式,定义跟实例化的类型必须完全一致。

通配符泛型

为了解决类型被限制死了不能动态根据实例来确定的缺点,引入了“通配符泛型”,针对上面的例子,使用通配泛型格式为 extends Collection>,“?”代表未知类型,这个类型是实现Collection接口。那么上面实现的方式可以写为:

public static void main(String args[]) {

Generics genList = null;

genList = new Generics(new ArrayList());

//以下代码可以通过编译

Generics extends Collection> genCollention = null;

genCollention=new Generics(new ArrayList());

System.out.println("可以编译通过并运行!");

}

1、如果只指定了>,而没有extends,则默认是允许Object及其下的任何Java类了。也就是任意类。

2、通配符泛型不单可以向下限制,如 extends Collection>,还可以向上限制,如 super Double>,表示类型只能接受Double及其上层父类类型,如Number、Object类型的实例。

3、泛型类定义可以有多个泛型参数,中间用逗号隔开,还可以定义泛型接口,泛型方法。这些都与泛型类中泛型的使用规则类似。

多接口限制

虽然Java泛型简单的用 extends 统一的表示了原有的 extends 和 implements 的概念,但仍要遵循应用的体系,Java 只能继承一个类,但可以实现多个接口,所以你的某个类型需要用 extends 限定,且有多种类型的时候,只能存在一个是类,并且类写在第一位,接口列在后面,也就是:

这里的例子仅演示了泛型方法的类型限定,对于泛型类中类型参数的限制用完全一样的规则,只是加在类声明的头部,如:

public class Demo{

//T类型就可以用Comparable声明的方法和Seriablizable所拥有的特性了

}

r java 泛型_Java 泛型相关推荐

  1. java泛型的泛型_Java 泛型总结(一):基本用法与类型擦除

    简介 Java 在 1.5 引入了泛型机制,泛型本质是参数化类型,也就是说变量的类型是一个参数,在使用时再指定为具体类型.泛型可以用于类.接口.方法,通过使用泛型可以使代码更简单.安全.然而 Java ...

  2. 什么是java泛型_java泛型背后是什么

    这一节主要讲的内容是java中泛型的应用,通过该篇让大家更好地理解泛型,以及面试中经常说的泛型类型擦除是什么概念,今天就带着这几个问题一起看下: 举一个简单的例子: image.png 这里可以看出来 ...

  3. java模型给泛型_java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一

    对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 1. 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应 ...

  4. java 泛型嵌套泛型_Java泛型简介–第6部分

    java 泛型嵌套泛型 这是关于泛型的介绍性讨论的延续, 此处的先前部分可以在此处找到. 在上一篇文章中,我们讨论了关于类型参数的递归边界. 我们看到了递归绑定如何帮助我们重用了车辆比较逻辑. 在该文 ...

  5. java 获取泛型_Java泛型 | Jackson TypeReference获取泛型类型信息

    前言 Jackson是一个比较流行的Json序列化和反序列化框架.本文以Jackson为例介绍TypeReference实现涉及泛型的反序列化,及TypeReference的实现原理.对于获取泛型类型 ...

  6. java泛型类指定多个泛型_Java泛型中的多态

    java泛型类指定多个泛型 从作为Java程序员的早期开始,我们都知道如何实例化和使用Collection对象. 实例化为具体类的List接口将如下所示. List myArrayList = new ...

  7. java怎么使用泛型_java泛型 7 泛型的基本介绍和使用

    现在开始深入学习Java的泛型了,以前一直只是在集合中简单的使用泛型,根本就不明白泛型的原理和作用.泛型在java中,是一个十分重要的特性,所以要好好的研究下. 一.泛型的基本概念 泛型的定义:泛型是 ...

  8. java 高级泛型_java泛型的高级应用

    展开全部 在上面的例子中,由于没有限制class GenericsFoo类型持有者T的范围,实际上这里32313133353236313431303231363533e59b9ee7ad9431333 ...

  9. 泛型 java 总结_JAVA泛型总结

    泛型是JDK1.5的新东西,总结了一下,以后备忘, 泛型也叫generics,泛型分泛型方法和泛型类,两种定义方式,泛型还有上界下界的说法, 先看看什么叫泛型方法和泛型类,一下是网上的一个解释,个人觉 ...

最新文章

  1. LInux初始学习篇:基本命令使用
  2. python 小例子 源码 莫凡_100 个 Python 小例子(一)
  3. Spring Aop之Advisor解析
  4. 一年月份大小月口诀_怎么看自己的日柱 公式 推算口诀 最简便计算方法
  5. matlab 加入高频噪声_Wavelet Integrated CNNs提高图像分类的噪声鲁棒性
  6. C语言 extern
  7. android方法的初始化,Android小技巧:自动初始化Library
  8. fiddler限速/弱网模拟
  9. aix系统怎么开启ftp服务器,liunx和aix 系统开启ftp服务
  10. Leetcode(二):Add Two Numbers
  11. [转]关于管理的经典故事(员工激励)
  12. Js跑马灯效果 在Vue中使用
  13. Struts2 验证码图片实例
  14. JUnit 4 vs JUnit 5
  15. 常用的富文本编辑器插件
  16. CodeMirror用户手册
  17. 元学习入门必备:MAML(背景+论文解读+代码分析)
  18. [黑客入门]花无涯新手入门教程笔记
  19. 卡诺模型案例分析_需求分析神器 | 如何用卡诺模型分析需求
  20. 推荐系统之itemCF

热门文章

  1. php7 一句话木马,PHP一句话木马后门
  2. Introducing AutoCAD 2009 and AutoCAD LT 2009
  3. 解决笔记本电脑时不时传出咚咚咚的声音问题
  4. Python3中.pyd文件介绍
  5. MathType使用技巧——保存常用公式
  6. 魏则西事件之后,民营医疗的营销方式
  7. VIM正则表达式详解
  8. android 开启一个定时线程_Android 定时器实现方式
  9. 练习——shell脚本+kickstart自动安装虚拟机
  10. linux 重启服务器脚本_使用简单脚本诊断Linux服务器负载问题