泛型

一.泛型

1.1 定义

泛型也叫作自定义数据类型,或者参数化类型,时间当前类的属性的类型,方法参数的类型,以及方法返回值的类型的定义权移交给使用者,使用者在创建当前类的同时将泛型的实际类型传入。泛型的原型是Object,泛型的检验工作是在编译时期完成的,如果我们规定了泛型的类型是String的集合ArrayList(),我们可以通过反射机制在程序的运行阶段,向该集合中添加不同类型的元素。定义了泛型只是编译器在做一些工作。当我们对泛型的类型设置值的时候,编译器会检查所传入的数据是否满足类型的要求,当我们在获取一个泛型类型的值的时候,会自动进行类型的转换。泛型就是一个标签,集合Collection<E>,其中的E表示的就是泛型,一般使用大写字母表示,在JDK1.5的时候java中引进了泛型的概念。以前我们存储数据的时候使用的是数组或者对象来存储数据,对于数组而言只能存储单一类型的数据,其实这个也是数组的优势。引入泛型只有就可以明确集合中的数据类型,可以保证集合容器存储数据的单一性,提高了安全性。如果一个类或者一个接口或者方法声明了泛型的类型,那么在类的实例化的时候,通常需要指明泛型的类型,如果没有指定就默认按Object类型来处理,如果指明了泛型的类型就可以避免在遍历集合的时候出现类型转换异常,由于集合中存放的是对象,因此对于泛型结构的具体类型不能是八种基本数据类型,必须是他们的包装类。

1.2自定义泛型类

泛型结构可以使用在方法上,但是不一定是泛型方法。在构造方法中不能创建泛型类型的数组和对象,因为创建数组和对象是具体的操作,泛型的类型只有在创建实例的时候才确定,可以创建一个Object类型的数组,但是需要强制类型的转换。

//泛型结构可以使用在方法上,但不一定是泛型方法
	public GenericDemo2(E e, String username, String password) {
		super();
		this.e = e;
		this.username = username;
		this.password = password;
//		this.e=new E();
//		E[]e1=new E[10];
		E[]e2=(E[]) new Object[10];
	}

1.3 继承关系中的泛型

在继承关系中,如果子类需要保留父类中的泛型结构,有两种方式:class A extends B<Integer>这种实现方式是直接声明父类的泛型结构;class A<T> extends B<T>这种方式是通过声明子类的泛型类型指明父类的泛型类型,从而保留父类中的泛型结构,如果两个类具有子父类关系并且泛型的类型不相同,那么这两个类的应用之间不能相互赋值。

@Test
	public void test4() {
    	Person<Integer> p=new Person(1,"12");
    	Student<String> s=new Student();
    	//p=s;
}
//继承关系中子类保留父类的泛型结构
package Fanxing;

import JiHEXu.Person;

public class Student<T> extends Person<T>{

	public Student(int age, String name) {
		super(age, name);
		// TODO Auto-generated constructor stub
	}

}

1.4注意事项

1.static修饰的方法中不能使用泛型结构(此处的泛型是函数的返回值不是泛型)除泛型方法外。因为泛型的类型是在对象创建的时候才确定的,但是static修饰的结构随着类加载而加载。

2.自定义异常类不允许使用泛型。

3.泛型方法不需要依托类或者接口去表明泛型结构。泛型的类型是在方法调用的时候确定,泛型方法可以声明为static。

泛型方法的声明:

public class GenericMethodDemo1 {
	public <T> T getName(T t){
		return t;
	}
}

虽然该类没有声明泛型结构,但是此方法是泛型方法,因此此方法不会报错。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值