泛型是Jdk4.0以后的版本中所增加的新特性,增加这个新特性的原因是为了去解决元素存储的安全问题以及在获取和输出元素时需要进行强制转换的问题。
我们都知道,在没有使用泛型的时候,创建一个集合时编译器是不会报错的,就像下面这样
List
B
=
new
ArrayList();
但是编译器会有个警告,意味着我没们有加泛型,因为我们在创建了上面这个List类的集合B后,添加的元素可以是任意类型Object类的,但是在实际使用过程中你只想添加一个类型的元素,比如说int型,但是却意外的添加了几种不同的类型,而这些元素全部都是以Object类型存在于集合B中的,而当你获取集合中的元素中时需要进行强制转换,可能会非常的繁琐,也可能结果会报错:ClassCastException。
所以我们可以看出,如果一个集合没有使用泛型,它就是一个类型不安全的集合,要做到让它变得安全,就要用到泛型了,泛型的使用方式如下:
List<E>
A
=
new
ArrayList<E>();
上句中的E可以是任意基本数据类型的包装类(如int的包装类为Integer等等),但是不能为基本数据类型,如果像上面这样使用泛型去创建一个集合的话,就是类型安全的了,即集合中只能存入你所指定的那个类型的元素,一旦你尝试存入其他类型,编译器就会报错,以下是一个例子
import
java.util.ArrayList;
import
java.util.HashMap;
import
java.util.Iterator;
import
java.util.List;
import
java.util.Map;
import
org.junit.Test;
public
class
TestGeneric {
@Test
public
void
TestGeneric1(){
List<Integer>
A
=
new
ArrayList<Integer>();
A
.add(55);
A
.add(66);
A
.add(77);
Iterator<Integer>
i
=
A
.iterator();
while
(
i
.hasNext())
{
System.
out
.println(
i
.next());
}
}
}
//55
//66
//77
上面这个例子是利用了泛型进行int型数据类型的存取,我们可以看到在存储完元素进行遍历的时候,迭代器也使用了泛型,这是必要的,否则就会有警告,提示你应该加上泛型
对于Map接口,我们在使用泛型的时候应该给它的key与value都加上泛型,像这样:
//Map中泛型的使用
Map<String,Integer>
M
=
new
HashMap<
String,Integer
>();
M
.put(
"MM"
, 1001);
M
.put(
"GG"
, 1004);
M
.put(
"GG"
, 1003);
Set<Map.Entry<String,Integer>>
a
=
M
.entrySet();
for
(Map.Entry<String, Integer>
each
:
a
)
{
System.
out
.println(
each
);
}
同样的,我们在遍历的时候,由于每一个key-value都是一个Entry,所以在遍历每一个Entry时也需要使用泛型