java里面,关于set的元素的添加的问题,下面有代码(标题不方便叙述)
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,它是每一个类型的成员。
首先当你为声明定义类型后你必需为创建的对象也定义相同类型否则报错:HashSet<?> set = new HashSet <?>() ;
然后?不是一个类型,你要定义的类型必需有意义,如Object,String
最后说下集合没有定义类型时默认可以放入Object也就是任何类型,如果你定义成int类型就无法add("abc")了只能add(1234)
查阅了一番,总结就是 : ? 通配符。也可以理解为占位符。 ?类型只能不能添加除 null 以外的值,但是可以接收其他组
Set<Integer> set1 = new HashSet<Integer>();
set1.add(1);
set1.add(2);
set1.add(3);
Set<?> set2 = new HashSet();
set2 = set1;
还有
? extends E: 可以接收E类型或者E的子类型。上限。
? super E: 可以接收E类型或者E的父类型。下限
我平时都用object ,所以对?类型也不是特别了解
Collection<?>这样一个类型,读作“未知Colleciton”。它的意思是说Colleciton的元素类型可以匹配任意类型,我们把它称作通配符类型,我们可以写成Object 类型就可以啦。