HashSet<String> set = new HashSet<String> () ;
set.add("abc") ;
这样写能够添加abc这个字符串。
但是如果前边的string变成问号就会报错,这是为什么呢?
HashSet<?> set = new HashSet<String> () ;
set.add("abc") ;
HashSet<String> set = new HashSet<String> () ;
set.add("abc") ;
这样写能够添加abc这个字符串。
但是如果前边的string变成问号就会报错,这是为什么呢?
HashSet<?> set = new HashSet<String> () ;
set.add("abc") ;
Collection<?>这样一个类型,读作“未知Colleciton”。它的意思是说Colleciton的元素类型可以匹配任意类型,我们把它称作通配符类型,我们这样写:
void printCollection(Colleciton<?> c){
for (Object e: c){
System.out.println(e);
}
}
现在我们用任意类型的集合来调用它了,需要注意的是内部方法printColleciton(),我们任可以从c中来读出元素,并且这些元素是Object类型,而且是安全的,因为无论集合中是什么类型,它总包括Object,但是将任意对象加到集合中是不安全的:
Colleciton<?> c = new ArrayList<String>();
c.add(new Object());//编译时错误
由于我们不知道c持有的是什么类型的元素,我们不能加object到集合中去。add()方法用类型E作为参数,(集合的元素类型)当真正的参数类型是?的时候,它代表的是一些未知类型。任何传递给add()方法的参数必须是这个未知类型的子类型。由于我们不知道未知类型,所以我们传递给它任何东西。主要的例外是null,它是每一个类型的成员。