黑马程序员技术交流社区
标题: keySet的小问题 谢谢大家!~ [打印本页]
作者: 王红霞 时间: 2012-7-19 19:28
标题: keySet的小问题 谢谢大家!~
本帖最后由 王红霞 于 2012-7-19 22:33 编辑
String是Object的子类 而且打印出来的结果也是String类型的 为什么还是会出错?麻烦给讲解一下原因 谢谢
正确的程序
import java.util.*;
class SystemDemo
{
public static void main(String[] args)
{
Properties prop=System.getProperties();
String value=System.getProperty("os.name");
System.out.println("value:"+value);
for (Object obj:prop.keySet())
{
String value=(String)prop.get(obj);
System.out.println(obj+"::"+value);
}
}
}
================================================
错误的程序
import java.util.*;
class SystemDemo
{
public static void main(String[] args)
{
Properties prop=System.getProperties();
for (String s:prop.keySet())//为什么这句就不行?出错呢?
{
String value=prop.get(s);
System.out.println(s+"::"+value);
}
}
}
-
未命名.jpg
(21.4 KB, 下载次数: 54)
作者: 吴立杰 时间: 2012-7-19 19:54
首先你要知道Properties是一个集合类,如果在不加泛型的情况下,它这个容器里面是可以装任何东西的,也就是说,数据进入集合的时候是要穿上Object这个上帝的衣服的,所以出来的时候你要强转它啊
作者: rslheima 时间: 2012-7-19 21:25
本帖最后由 rslheima 于 2012-7-19 21:34 编辑
把你的程序拆开下讲解:
public static void main(String[] args)
{
Properties prop=System.getProperties();
Set<Object> keySet=prop.keySet();
for(Object s:keySet){
String value=(String) prop.get(s);
System.out.println(s+"::"+value);
}
}
java.util.Hashtable<Object,Object>
|
java.util.Properties
Properties是Hashtable的子类他存储的对象是各种类型的对象(Object), Set<E> keySet=prop.keySet();
E要和prop.keySet()返回的类型相同啊,他就是Object所以E也为Object,
作者: 刘笑 时间: 2012-7-19 21:38
你咋知道prop.keySet()返回值是String类型的呢?所以不能String s:prop.keySet();String value=(String)prop.get(obj)这一句是将返回值强转成String类型的,二者不同
作者: 李菁 时间: 2012-7-19 21:59
Properties是Hashtable的子类,它里面存储的对象是Object类型,要取的属性值是String,所以要进行强制类型转换
作者: 王红霞 时间: 2012-7-19 22:31
刘笑 发表于 2012-7-19 21:38 
你咋知道prop.keySet()返回值是String类型的呢?所以不能String s:prop.keySet();String value=(String)pr ...
嗯 谢谢你 如醍醐灌顶啊!~
作者: 王红霞 时间: 2012-7-19 22:31
李菁 发表于 2012-7-19 21:59 
Properties是Hashtable的子类,它里面存储的对象是Object类型,要取的属性值是String,所以要进行强制类型 ...
嗯 确实~
作者: 张莹莹 时间: 2012-7-19 23:37
我从源代码的角度分析一下为什么
for(String s:prop.keySet())
这里是错误的
首先我们来看一下Properties的源代码:1.png
可以发现其是继承了Hashtable<Object,Object>的。解释一下Hashtable<K,V>中K、V的意思,其中K代表Key的类型(这里为Object),而V代表Value的类型(这里为Object)。
我们再来看一下keySet方法的源代码,其返回类型是Set<K>,所以当调用Properties的keySet()方法,返回的就是集合Set,其中集合的类型为K,即Object。
所以在写foreach循环的时候,只能是Object obj:prop.keySet(),而不能是String s:prop.keySet()。
-
1.png
(7.36 KB, 下载次数: 44)
Properties
-
2.png
(12.71 KB, 下载次数: 49)
Keyset
作者: 王红霞 时间: 2012-7-19 23:45
张莹莹 发表于 2012-7-19 23:37 
我从源代码的角度分析一下为什么for(String s:prop.keySet())这里是错误的首先我们来看一下Properties的源 ...
嗯 谢谢~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |