文章目录
  1. 1. java泛型通配符?未限定使用时和原生类型都可以表示任意类型,区别何在?

java泛型通配符?未限定使用时和原生类型都可以表示任意类型,区别何在?

关于 Set<?> 的事实:

1. 因为集合被 ?  标注,故Set<?> 可容纳任意类型;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Legal Code
public static void main(String[] args) {
HashSet<Integer> s1 = new HashSet<Integer>(Arrays.asList(1, 2, 3));
printSet(s1);
HashSet<String> s2 = new HashSet<String>(Arrays.asList("a", "b", "c"));
printSet(s2);
}
public static void printSet(Set<?> s) {
for (Object o : s) {
System.out.println(o);
}
}
2. 因为不知道 ?代表那种类型,所有我们不能往 Set<?> 中添加任何元素(除了null);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//Illegal Code
public static void printSet(Set<?> s) {
s.add(10);//this line is illegal
for (Object o : s) {
System.out.println(o);
}
}
//legal Code
public static void printSet(Set s) {
s.add("2");
for (Object o : s) {
System.out.println(o);
}
}
//Illegal Code
Set<?> set = new HashSet<?>();

综上:都可以代表任意元素,但添加动作仅限于原生类型,通配符限定一般用于形参。使用泛型可以保证类型安全,原生类型无法保证;

文章目录
  1. 1. java泛型通配符?未限定使用时和原生类型都可以表示任意类型,区别何在?