泛型的出现使数据类型的错误止步在源码级别上,也就是我们所说的编译型错误。
今天就跟大家探讨下Java泛型以及自定义泛型的使用:
一、Java中的泛型
1
@Test
2
3
public
void
test()
throws
Exception{
4
5
//
把List集合的类型限制在String类类型范围内,在这里使用了泛型
6
7
List
<
String
>
list
=
new
ArrayList
<
String
>
();
8
9
//
向该集合中插入符合该泛型的数据
10
11
list.add(
"
a
"
);
12
13
list.add(
"
b
"
);
14
15
list.add(
"
c
"
);
16
17
//
迭代器迭代该泛型集合
18
19
Iterator
<
String
>
it
=
list.iterator();
20
21
//
输出该集合中的所有元素
22
23
while
(it.hasNext()){
24
25
String value
=
it.next();
26
27
System.out.println(value);
28
29
}
30
31
}
32
33
34
35
@Test
36
37
public
void
test02()
throws
Exception{
38
39
//
键值泛型集合map
40
41
Map
<
Integer, String
>
map
=
new
HashMap
<
Integer, String
>
();
42
43
//
向map集合中插入值
44
45
map.put(
1
,
"
aa
"
);
46
47
map.put(
2
,
"
bb
"
);
48
49
map.put(
3
,
"
cc
"
);
50
51
//
使用set的集合来接受map中的对象
52
53
Set
<
Entry
<
Integer, String
>>
set
=
map.entrySet();
54
55
//
使用JDK 1.5加强版循环来遍历map中的键以及所对应的值
56
57
for
(Entry
<
Integer, String
>
entry:set){
58
59
System.out.println(entry.getKey()
+
"
---
"
+
entry.getValue());
60
61
}
62
63
}
64
65
66
67
@Test
68
69
public
void
test03()
throws
Exception{
70
71
//
键值泛型集合map
72
73
Map
<
Integer, String
>
map
=
new
HashMap
<
Integer, String
>
();
74
75
//
向map集合中插入值
76
77
map.put(
1
,
"
aaa
"
);
78
79
map.put(
2
,
"
bbb
"
);
80
81
map.put(
3
,
"
ccc
"
);
82
83
//
使用set集合来接受map对象中的键
84
85
Set
<
Integer
>
set
=
map.keySet();
86
87
//
同过JDK 1.5加强循环以及set中的键来获得对应的值
88
89
for
(Integer value:set){
90
91
System.out.println(map.get(value));
92
93
}
94
95
}
//这种创建方式是错误的 List<String> list = new ArrayList<Object>();
//同上 List<Object> list1 = new ArrayList<String>();
//以下创建时正确的,目的是为了统一jdk1.4 jdk1.5
List<String> list = new ArrayList();
List list1 = new ArrayList<String>();
二、自定义类的泛型使用
1
public
class
Demo02 {
2
3
4
5
//
定义 泛型 在方法上定义
6
7
public
<
T
>
void
test1(T l){
//
应用的对象
8
9
}
10
11
public
static
<
T
>
void
test2(T l){
//
应用的对象
12
13
}
14
15
16
17
public
<
T
>
int
test3(T l){
//
应用的对象
18
19
return
0
;
20
21
}
22
23
public
<
T
>
List
<
T
>
test4(){
24
25
return
null
;
26
27
}
从以上的代码中我们可以看出泛型也可以定义使用在方法上,并且在泛型的<T>要放在方法的返回类型之前;
下面我们来看自定义泛型中的特殊情况:
1
public
class
Demo03
<
T,E
>
{
2
3
4
5
public
void
test1(T entity){
6
7
8
9
}
10
11
12
13
public
List
<
T
>
test2(){
14
15
return
null
;
16
17
}
18
19
20
21
//
在类上声明的泛型不能够用在static修饰的方法上
22
23
public
static
<
TT
>
void
test2(TT l){
//
应用的对象
24
25
26
27
}
28
29
}
由上面的源码中可以看出泛型可以直接在类上直接声明,但在类上声明的泛型不能用在static修饰的方法上。