A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王红霞 中级黑马   /  2012-7-19 19:28  /  2643 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王红霞 于 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, 下载次数: 35)

未命名.jpg

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

9 个回复

倒序浏览
首先你要知道Properties是一个集合类,如果在不加泛型的情况下,它这个容器里面是可以装任何东西的,也就是说,数据进入集合的时候是要穿上Object这个上帝的衣服的,所以出来的时候你要强转它啊
回复 使用道具 举报
本帖最后由 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,

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
你咋知道prop.keySet()返回值是String类型的呢?所以不能String s:prop.keySet();String value=(String)prop.get(obj)这一句是将返回值强转成String类型的,二者不同
回复 使用道具 举报
Properties是Hashtable的子类,它里面存储的对象是Object类型,要取的属性值是String,所以要进行强制类型转换
回复 使用道具 举报
错误的程序
import java.util.*;
class  SystemDemo
{
        public static void main(String[] args)
        {
                Properties prop=System.getProperties();
                for (String s:prop.keySet())
//这个增强型for循环中的变量类型定义有问题。我们先明确要遍历的是prop.keySet()这个Set集合,那么就需要确定Set集合中元素的类型
//因为Properties是Hashtable的子类,通过查阅API,public Set<K> keySet();Set集合元素类型为K,是一个对象类型,即Object,所以正确的写法是for(Object s:prop.keySet())

                {
                        String value=prop.get(s);
//prop.get(s)方法中参数也应该是Object类型,错误原因在上面。上面写对了,这里就不会报错了。
//另外prop.get(s)的返回值也是一个Object类型,如果将其赋给一个String对象,需要向下转型,正确写法为String value = (String) prop.get(s);

                        System.out.println(s+"::"+value);
                }
               
        }
}

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
刘笑 发表于 2012-7-19 21:38
你咋知道prop.keySet()返回值是String类型的呢?所以不能String s:prop.keySet();String value=(String)pr ...

嗯 谢谢你  如醍醐灌顶啊!~
回复 使用道具 举报
李菁 发表于 2012-7-19 21:59
Properties是Hashtable的子类,它里面存储的对象是Object类型,要取的属性值是String,所以要进行强制类型 ...

嗯 确实~
回复 使用道具 举报
我从源代码的角度分析一下为什么
for(String s:prop.keySet())
这里是错误的
首先我们来看一下Properties的源代码:1.png
可以发现其是继承了Hashtable<Object,Object>的。解释一下Hashtable<K,V>KV的意思,其中K代表Key的类型(这里为Object),而V代表Value的类型(这里为Object)。
我们再来看一下keySet方法的源代码,其返回类型是Set<K>,所以当调用PropertieskeySet()方法,返回的就是集合Set,其中集合的类型为K,即Object
所以在写foreach循环的时候,只能是Object obj:prop.keySet(),而不能是String s:prop.keySet()。

1.png (7.36 KB, 下载次数: 31)

Properties

Properties

2.png (12.71 KB, 下载次数: 30)

Keyset

Keyset

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
张莹莹 发表于 2012-7-19 23:37
我从源代码的角度分析一下为什么for(String s:prop.keySet())这里是错误的首先我们来看一下Properties的源 ...

嗯 谢谢~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马