理想情况下,您可能会得出这样一个观点,即 m 是一个 Map,它将 String 键映射到 String 值。这可以让您消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中。这就是泛型所做的工作。作者: jialihong 时间: 2013-7-25 13:58
jdk1.5以前的集合类中存在什么问题?
ArrayList collection = new ArrayList();
collection.add(1);
collection.add(1L);
collection.add("abc");
int i = (Integer)arrayList.get(1);//编译要强制类型转换且运行时出错
jdk1.5的集合类希望你在定义集合时,明确表示你要向集合中装哪种类型的数据,无法加入指定类型以外的数据
ArrayList<Integer> collection2 = new ArrayList<Integer>();
collection2.add(1);
/*
collection2.add(1L);
collection2.add("abc");
*///这两行代码编译时就报告了语法错误
int i2 = collection2.get(0);//不需要再进行类型转换
没有使用泛型时,只要是对象,不管是什么类型的对象,都可以存储进同一个集合中,使用泛型集合,可以将一个集合中的元素限定为一个特定类型集合中只能存储同一个类型的对象,这样更安全,并且当从集合中获取一个对象时,编译器也可以知道这个对象的类型,不需要对对象进行强制类型转换,这样更方便。
泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉“类型”信息,使程序运行效率爱影响,对于参数化的泛型,getClass方法的返回值和原始类型完全一样。由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入类型的数据,例如:用反射得到集合,再调用add方法即可。作者: liuzhming 时间: 2013-7-25 14:52 本帖最后由 liuzhming 于 2013-7-25 14:56 编辑
泛型之前,如果类别定义时的逻辑完全一样,只是里面成员变量的类型不同,需要定义多个类,这使得类的数量急剧膨胀。针对这种情况,设计了泛型。在定义类时,里面使用的类型不确定,而是让用户指定,这样减少了类定义的数量。举个例子,有两个这样的类:
public class IntegerFoo
{
private Integer foo;
public Integer getFoo()
{
return foo;
}
public void setFoo(Integer foo)
{
this.foo = foo;
}
}
public class StringFoo
{
private String foo;
public String getFoo()
{
return foo;
}
public void setFoo(String foo)
{
this.foo = foo;
}
}
这两个类里面实现逻辑完全相同,不同的仅仅是int和String类型,但却要定义两个。如果使用泛型,我们只需要定义一个类,如下:
public class Foo<T>
{
private T foo;
public T getFoo()
{
return foo;
}
public void setFoo(T foo)
{
this.foo = foo;
}
}
Java里面使用了大量的泛型,最常见的是在集合里面,比如ArrayList,LinkedList,HashSet,MapSet等,还有迭代器iterator和ListIterator。例如在创建ArrayList对象时:ArrayList<String> ar = new ArrayList<String>。并且ArrayList<String>是一个确定的类,与ArrayList<int>是不同的类,两者没有关系。