日期:2014-05-20  浏览次数:20906 次

关于集合的问题
如下代码:
import java.util.*;

public class Review22_9 {
public static void main(String[] args) {
Set<String> s1 = new HashSet<String>();
Set<String> s2 = new HashSet<String>();
s1.add("red");
s1.add("yellow");
s1.add("green");
s2.add("red");
s2.add("yellow");
s2.add("blue");
s1.add(s2);
                System.out.println(s1);
}
}

为什么我出现编译错误,而答案却说输出是
[green, red, yellow, [red, blue, yellow]] 
是答案错了吗?原书是《java语言程序设计 进阶篇》

还有我想问一下一下程序:
import java.util.*;

public class Exercise22_1 {
public static void main(String[] args) {
HashSet<String> s1 = new HashSet<String>();
s1.add("George");
s1.add("Jim");
s1.add("John");
s1.add("Blake");
s1.add("Kevin");
s1.add("Mechael");
HashSet<String> s2 = new HashSet<String>(Arrays.asList("George","Katie","Kevin","Michelle","Ryan"));
HashSet<String> s1Copy = (HashSet<String>)s1.clone();
HashSet<String> s2Copy = (HashSet<String>)s2.clone();
}
}

我想克隆一个集合,但是上面程序会出现泛型,应该怎么修改好呢?
------解决方案--------------------
S1定义的泛型是String,s1.add(s2); s2是HashSet,不是String,类型不匹配,肯定错啦.另外,克降和泛型无关,你原型是泛型的,克隆后的对象也是泛型.
------解决方案--------------------
s1.add(s2);
这里当然错了!
你定义的s1集合泛型是String,这个集合这能放入String,而s2不是String类型的
你确定是书上的代码吗?
克隆不需要修改吧?
------解决方案--------------------
。。。泛型啊亲  你定义的两个集合都是只能放String的。结果你s1.add(s2);放了一个集合进去,当然不对了!
------解决方案--------------------
引用:
那我如果想克隆 那么要如何做编译时才不会出现泛型的提示呢
泛型提示只是一个提示,没关系的,不写就行(默认object).如果写了,就得遵守泛型类型.
public static void main(String args[]) {
Set s1 = new HashSet();
Set s2 = new HashSet();
s1.add("red");
s1.add("yellow");
s1.add("green");
s2.add("red");
s2.add("yellow");
s2.add("blue");
s1.add(s2);
System.out.println(s1);
    HashSet s3 = new HashSet();
HashSet s3Copy = (HashSet) s3.clone();
}
这样就行了,不会错,只不过会有黄色下划波浪线,只是个提示,忽略它就可以了.
------解决方案--------------------
泛型的那个 <>可以不用考虑,可以忽略;
------解决方案--------------------
楼主 如果想要在一个集合中添加另一个集合的元素 可以用addAll方法,其他的关于为什么编译错误,大家前面的回答都说得比较清楚了 是由于泛型的原因 你定义的是string 就只能放string类型的数据
------解决方案--------------------
问题1:编译会出错的,你把泛型去了,编译可以通过。
问题2:clone()返回此 HashSet 实例的浅表副本是Object。(不复制这些元素本身)你把Object再强制转化为HashSet<String>,肯定会提示你的。如果你想得到set的副本,你可以new HashSet(s1),new HashSet(s2);
------解决方案--------------------
引用:
那我如果想克隆 那么要如何做编译时才不会出现泛型的提示呢

java的集合只是建议使用泛型并不是必须使用泛型,但是你一旦定义了泛型就必须放入该类型的对象。克隆集合的方法很多啊,建议用集合的allAll()方法。
------解决方案--------------------
第一个问题你已经第一泛型了Set<String> s1 = new HashSet<String>();只能放入String类型的你放的set当然出现编译错误!还有答案当然是不确定的因为set是无序的就算你把泛型去掉答案也与他给的不一定一样我就得出这个答案了:[red, green, yellow, [red, blue, yellow]]