Java泛型


前言

     泛型是java进阶的内容,也是学习java的重要掌握内容。本文对泛型进行一个简单的概述,让大家对泛型有基本的理解。


一、什么是泛型?

    泛型就是“类型参数化”,将原本的具体的数据类型变成参数化(即未确定)的类型。这里可以对比Java中方法中的实参和形参。实参对应具体的数据类型,而实参就对应着参数化类型,然后再在被调用的时候传入具体的数据类型。这样就很好理解泛型了。

二、泛型的几种实现形式

1.泛型类

代码如下(示例):

	public class ClassName<T>{
		private T data;
		public T getData(){
			return data;
		}
		public void setData(T data){
			this.data = data;
		}
	}

2.泛型接口

代码如下(示例):

	public interface InterfaceName<T>{
		T getData();
	}

    实现接口时,可以选择指定泛型类型,也可以选择不指定, 如下:
    (1)指定类型:

	public class Interface1 implements IntercaceName<String> { 
		private String text; 
		@Override 
		public String getData() { 
				return text; 
		} 
	} 

    (2)不指定类型:

	public class Interface1<T> implements IntercaceName<T> { 
		private T data; 
		@Override 
		public T getData() { 
			return data; 
		} 
	}

3.泛型方法

	private static <T> T 方法名(T a, T b) {} 

以下是引用别人的理解做一下扩展。

    定义泛型方法时,必须在返回值前边加一个,来声明这是一个泛型方法,持有一个泛型T,然后才可以用泛型T作为方法的返回值。

    Class的作用就是指明泛型的具体类型,而Class类型的变量c,可以用来创建泛型类的对象。

    为什么要用变量c来创建对象呢?既然是泛型方法,就代表着我们不知道具体的类型是什么,也不知道构造方法如何,因此没有办法去new一个对象,但可以利用变量c的newInstance方法去创建对象,也就是利用反射创建对象。

    泛型方法要求的参数是Class类型,而Class.forName()方法的返回值也是Class,因此可以用Class.forName()作为参数。其中,forName()方法中的参数是何种类型,返回的Class就是何种类型。在本例中,forName()方法中传入的是User类的完整路径,因此返回的是Class类型的对象,因此调用泛型方法时,变量c的类型就是Class,因此泛型方法中的泛型T就被指明为User,因此变量obj的类型为User。

    当然,泛型方法不是仅仅可以有一个参数Class,可以根据需要添加其他参数。

    为什么要使用泛型方法呢?因为泛型类要在实例化的时候就指明类型,如果想换一种类型,不得不重新new一次,可能不够灵活;而泛型方法可以在调用的时候指明类型,更加灵活。

在这里插入图片描述

以上涉及到到的反射,“所以”还没有悟透!待悟透后会再写一篇博客去说说自己的理解。


三.扩展

(1) 泛型的限制类型

在使用泛型时,可以指定泛型的限定区域:

    例如,必须是某某类的子类或某某接口的实现类,格式:
            <T extends 类或接口1&接口2>

	注意:这是在定义形参类型时用的,与下面通配符区分。

(2)泛型中的通配符

通配符是使用?代替方法具体的类型实参。
        1.<? extends Parent> 指定了泛型类型的上界。即只能是Parent或其子类。         2.<? super Child> 指定了泛型类型的下界。即只能是Child或其父类         3.<?> 指定了没有限制的泛型类型。(并不等同Object,要区分)

(3)泛型擦除

    在编译之后程序会采取去泛型化的措施。也就是说Java中的泛型,只在编译阶段有效。
    在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是所谓的泛型擦除。
    也就是说,泛型信息不会进入到运行时阶段。

四.作用

作用
    1、 提高代码复用率
    2、 泛型中的类型在使用时指定,不需要强制类型转换(类型安全,编译器会检查类型)

总结

    本文介绍了泛型的基本概念和几种实现形式等一些相关基础知识,希望本文能给你带来一点帮助。如有不足,希望指出,大家一起进步!

引用链接:https://www.cnblogs.com/JokerShi/p/8117556.html

                                                                    我是睡了没,祝你幸福!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值