泛型笔记

发布于 / java / 0 条评论

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。本文主要描述的是泛型类。

Java语言引入泛型的好处:1)最大程度的保证了类型安全;2)简化编译

我们以ArrayList类为例:

1)如果没有泛型,我们要不然需要为每一种类型X编写一个XArrayList类;要不然在ArrayList中用Object的对象来存储数据,然后每次取出对象时使用类型转换;

2)而我们使用了泛型方式来定义ArrayList:public class ArrayList<T>{}  ,既保证了每次使用ArrayList时的类型安全,又简化了实现ArrayList的编程工作。

好了,下面我们还是先抛出泛型类的概念和特性:

基础概念:

泛型类实际就是一个带参数的类。泛型类定义可以有多个泛型参数,中间用逗号隔开。泛型的概念也存在于C++和C#语言中。如同如下代码:

public class MyList<T> {
	private List<T> list=new ArrayList<T>();
	public T get(int index){
		return list.get(index);
	}
	//此处省略了若干内容....
}

受限制的泛型类定义:
假设我们定义了以下三个类:

 

  现在我就想专门针对上述三个类编写一个List类,则如下代码如示:

public class MyList<T extends Animal> {
	private List<T> list=new ArrayList<T>();
	public T get(int index){
		return list.get(index);
	}
	//此处省略了若干内容....
}

  如此的话,就可以将MyList的类参数的使用限制在Animal及其子类了。如果违反这个规则,编译期就会报错的。这样,就很大程度上保证了类型安全。

  MyList<Object> list=null;//编译出错

通配符泛型:
有时在使用泛型类时,遇到不太确定参数的类型,可以用?代替。尤其是在做Java反射时:

  Class<?> clazz=Class.forName(className);

  受限制的通配符类型:但有时,你虽然不能确定类参数的具体类型,但是你能确定它大概的类型,比如该参数类型是Animal或者是其子类。

  此时可以这样用:Class<? extends Animal> clazz=Class.forName(className);

       需要注意的是:通配符不仅可以向下限制[通配符代表某类型或某类型的子类],还可以向上限制[通配符代表某类型或是某类型的父类]

  比如:Class<? super Cat>  clazz=Class.forName(className);//表示?代表的是Cat或Cat的基类Animal

  当然,还有一些其它的例子来描述通配符:

比如定义一个变量:List<? extends Animal> animals=new ArrayList<Cat>();

 

Not Comment Found