文档章节

Java进阶之路——泛型

liululee
 liululee
发布于 2019/05/22 08:43
字数 987
阅读 43
收藏 0

1.引言

泛型是指参数化类型的能力,可以定义带泛型的方法或类,随后编译器会使用具体的类型来代替它。Java中可以定义泛型类,泛型接口和泛型犯法。

2.优点

使用泛型能够使程序在编译期就抛出异常,避免在运行期发生异常,由于错误在编译时可以被检测到,因此程序更加可靠。 泛型类型必须是引用类型:例如Integer, Double, Float等,而不能是int,double,float。例如给int值创建一个ArrayList,必须这么定义:

   List<Integer> list = new ArrayList<Integer>();

那为什么要使用引用类型呢?比如要向上面的list添加一个元素list.add(6),Java会自动包装成 new Integer(6),这个过程也称为自动打包(autoboxing)。当我们要从ArrayList中取出一个元素时:int a = list.get(0),这时候会发生自动解包(autounboxing),即:将包装类型赋值给基本类型。

3.定义泛型类和接口

这很简单:

    // 简单泛型类
    public class Generic<T> {
	    List<T> list = new ArrayList<T>();
	    public int getSize() {
		    return list.size();
		}
	}
	
	// 简单泛型接口
	// 参考java中的Comparable接口,Java API中String类被定义为实现Comparable接口
	public class String implements Comparable<String> {
	    // todo
	}

4.泛型方法

概念: 受限泛型:可以将泛型指定为另外一种类型的子类型,这种泛型称为受限泛型。 非受限泛型:可以理解为泛型类继承Object。<E> 和 <E extends Object>是一样的。 定义泛型方法:

	public class Bound {
	    public static <E extends Generic> boolean equals(E o1, E o2) {
		    return o1 == o2;
		}
	}

注意定义泛型类和泛型方法的区别: 泛型类如Generic<E>泛型类型在类名之后,而泛型方法中的泛型类型在方法返回类型之前:public static <E extends Generic> boolean equals(E o1, E o2)

5.泛型通配符

三个概念: 非受限通配:<? extends Object> 受限通配:<? extends T> T为未知子类 下限通配:<? super T> T为未知父类 使用场景具体分析,这个应该不难。 ##6.泛型消除 泛型是使用一种成为泛型消除的方法来实现的。编译器通过泛型类型信息来编译代码,但是随后会消除它。切记,泛型只存在于编译时。 简单说就是:泛型在JVM中会被转换为原始类型来替代!

不管实际的具体类型是什么,泛型类是被它的所有实例共享的。例如:

	ArrayList<String> list1 = new ArrayList<String>();
	ArrayList<Integer> list2 = new ArrayList<Integer>();

运行时只有一个ArrayList类会被加载的JVM中, list1和list2都是ArrayList的实例,因此list1 instanceof ArrayListlist2 instanceof ArrayList都是true。但list1 instanceof ArrayList<String>是没有错误的,因为JVM无法ArrayList<String>保存为一个类。

6.使用泛型的限制

  1. 不能使用new E();
  2. 不能使用new E[]; 不要使用泛型来声明一个数组
  3. 静态环境下,不允许类的参数是泛型类型。如
    public class Test<E> {
	    public static E o1; // NO!
		static {
		    E o2; // NO!
		}
	    public static void mia(E o) { //NO!
        
		}
	}
  1. 异常类不能是泛型。

7.总结

本文主要是复习一些有关泛型的基础知识,包括泛型的类型,泛型通配,和泛型消除等。要注意的是泛型只是用来在编译是代替具体类型的,在运行时会发生泛型消除,被JVM替换为原始类型。

最后,欢迎大家关注我的个人公众号或者 加我微信点这里:

© 著作权归作者所有

liululee
粉丝 130
博文 80
码字总数 117498
作品 0
杭州
程序员
私信 提问
加载中

评论(1)

ershalan
ershalan
作者,你好!我是腾讯云+社区的小编,关注了您分享的技术文章,觉得很棒,我们诚挚邀请您加入云+社区,与我们众多的社区作者一起为开发者分享技术干货。这个是我们云+社区【腾讯云自媒体分享计划】入驻流程和权益介绍的地址:https://cloud.tencent.com/developer/support-plan。如果您愿意加入或者想了解更多的信息请联系我~微信:juxiaoka66,我们对您的加入充满期待。
【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank
2018/06/21
0
0
Cannot make a static reference to the non-stati...

今天碰到这样一些错误,Eclipse提示Cannot make a static reference to the non-static type T。代码如下: public class DAOFactory<D extends TemplateDAO<B>, B> {private static Map<Str......

开源中国驻成都办事处
2013/05/30
3K
0
Java反射——Type接口详解

Type的简介 java.lang.reflect.Type接口及其相关接口用于描述java中用到的所有类型,是Java的反射中很重要的组成部分。 在API文档中,Type接口的说明如下: Type 是 Java 编程语言中所有类型...

猴亮屏
2019/09/02
88
0
JAVA基础再回首(三十)——JAVA基础再回首完美结束,感概万千!

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m366917/article/details/52724939 JAVA基础再回首(三十)——JAVA基础再回首完美结束,感概万千! 经过了几...

Aduroidpc
2016/10/02
0
0
泥沙砖瓦浆木匠/java-core-learning-example

感谢赞助的ta们 Java 核心系列教程,关于Java核心技术学习积累的例子,是初学者及核心技术巩固的最佳实践。 包括基础语法,OOP,字符串,集合,IO,反射,线程,网络等。 未完成模块:阿里J...

泥沙砖瓦浆木匠
2019/04/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C#如何创建Guid值?

我们结构的一个字段是Guid类型。 如何为它生成有效值? #1楼 System.Guid desiredGuid = System.Guid.NewGuid(); #2楼 Guid id = Guid.NewGuid(); #3楼 Guid.NewGuid()创建一个新的随机gui...

技术盛宴
13分钟前
23
0
将idea中的springboot项目部署到远程的docker容器

1、在idea中创建项目,如下图 2、配置docker maven plugin <!-- Docker maven plugin --><plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifact......

Lion华
26分钟前
30
0
在C中,i ++和++ i之间是否存在性能差异?

如果不使用结果值, i++和++i之间会有性能差异吗? #1楼 请不要让“哪个更快”的问题成为使用哪个的决定因素。 您永远都不会在乎那么多,此外,程序员的阅读时间比机器学习的时间要昂贵得多。...

javail
29分钟前
26
0
Android MVP 快速开发框架ZBLibrary

MVP 架构,提供一套开发标准(View,Data,Event)以及模板和工具类并规范代码。封装层级少,简单高效兼容性好。 OKHttp、UIL图片加载、ZXing二维码、沉浸状态栏、下载安装、自动缓存以及各种B...

boonya
39分钟前
33
0
为BlueLake主题增加图片放大效果

fancyBox 是一个流行的媒体展示增强组件,可以方便为网站添加图片放大、相册浏览、视频弹出层播放等效果。优点有使用简单,支持高度自定义,兼顾触屏、响应式移动端特性,总之使用体验相当好...

CREATE_17
46分钟前
23
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部