理解使用泛型的必要性
掌握使用Java泛型
Java集合有一个缺点:Java集合会把我们“丢进”集合的元素默认为Object类型,没有记住元素本身的类型。当然,Java这样设计是有原因的:因为设计集合的程序员不会知道我们需要用这个集合来保存什么类型的对象,所以他们把集合设计成能保存任何类型的对易用。
这样设计会存在以下问题
集合对元素类型没有任何限制,这样可能引发一些问题。比如我们创建一个集合用于存放Person对象,但是程序可以轻易的将Dog对象放入这个集合中。
因为集合没有记住无素本身的类型,所以在取出这些元素时,要进行强制类型转换。这样就可能发生“类型转换异常(ClassCastException)"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public
class
ListErr {
public
static
void
main(String[] args) {
//创建一个List,只想用这个List来保存字符串
List strList =
new
ArrayList();
strList.add(
"孙悟空"
);
strList.add(
"猪八戒"
);
//不小心,将Integer类型的数据添加进去了
strList.add(
500
);
//遍历取值(strList里取出的值都是Object类型)
for
(Object object : strList) {
//可进行类型转换
String name = (String) object;
//进行到最后一个元素的时候,会发生类型转换错误
System.out.println(name);
}
}
}
|
总结:要使用泛型(Generic)原因
解决元素存储的安全性问题
解决获取数据元素时,需要类型强制转换问题
如果我们想要一个List对象,只能存放String对象,那么我们要对ArrayList进行扩展。代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public
class
StrList {
private
List strList =
new
ArrayList();
/**
* 重写添加元素方法
* @param str
* @return
*/
public
boolean
add(String str){
return
strList.add(str);
}
/**
* 重写get方法
* @param index
* @return
*/
public
String get(
int
index) {
return
(String) strList.get(index);
}
public
int
size(){
return
strList.size();
}
}
|
使用上面的List
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
class
TestStrList {
public
static
void
main(String[] args) {
//创建一个只想保存字符串的List集合
StrList strList =
new
StrList();
strList.add(
"孙悟空"
);
strList.add(
"猪八戒"
);
//将其他类型添加进去,就是编译不通过
//strList.add(500);
for
(
int
i=
0
;i<strList.size();i++) {
//无须强制类型转换
String name = strList.get(i);
}
}
}
|
上面的方法虽然已经很好的解决了Java集合原先存在的二个缺点,但如果将这种实现方式应用到实际项目开发中,是一件很恐怖的事情。因为我们要定义很多List子类。Java工程师肯定不会这么傻,那么Java又是如何解决这些问题的呢?
从JDK1.5以后,Java允许我们在创建集合时指定集合元素的类型。Java的参数化类型被称为泛型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
class
GenericList {
public
static
void
main(String[] args) {
//创建一个只想保存字符串的List集合
List<String> strList =
new
ArrayList<String>();
strList.add(
"孙悟空"
);
strList.add(
"猪八戒"
);
//将其他类型添加进去,就是编译不通过
//strList.add(500);
//无须强制类型换
for
(String string : strList) {
System.out.println(string);
}
}
}
|
1
2
3
4
5
6
7
8
|
public
class
GenericTest {
public
static
void
main(String[] args) {
List list =
new
ArrayList();
for
(Object object : list) {
}
}
}
|
http://edu.51cto.com/course/course_id-6083.html