![](https://csdnimg.cn/release/download_crawler_static/16792065/bg7.jpg)
T (type) 表示具体的一个java类型
K V (key value) 分别代表java键值中的Key Value
E (element) 代表Element
? 无界通配符
下面先从一个小例子看起:
我有一个父类 Animal 和几个子类,如狗、猫等,现在我需要一个动物的列表,我的第一个想法是像这
样的:
但是老板的想法确实这样的:
为什么要使用通配符而不是简单的泛型呢?通配符其实在声明局部变量时是没有什么意义的,但是当你
为一个方法声明一个参数时,它是非常重要的。
当调用 countLegs1 时,就会飘红,提示的错误信息如下:
所以,对于不确定或者不关心实际要操作的类型,可以使用无限制通配符(尖括号里一个问号,即 ),
表示可以持有任何类型。像 countLegs 方法中,限定了上届,但是不关心具体类型是什么,所以对于传
入的 Animal 的所有子类都可以支持,并且不会报错。而 countLegs1 就不行。
List<Animal> listAnimals1
List<? extends Animal> listAnimals1
static int countLegs (List<? extends Animal > animals ) {
int retVal = 0;
for ( Animal animal : animals ) {
retVal += animal.countLegs();
}
return retVal;
}
static int countLegs1 (List< Animal > animals ){
int retVal = 0;
for ( Animal animal : animals )
{
retVal += animal.countLegs();
}
return retVal;
}
public static void main(String[] args) {
List<Dog> dogs = new ArrayList<>();
// 不会报错
countLegs( dogs );
// 报错
countLegs1(dogs);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22