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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑世光 中级黑马   /  2012-9-1 09:27  /  2086 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.*;
class MapDemo
{
public static void main(String[] args)
{
  HashMap<String,String> hm=new HashMap<String,String>();
  TreeSet<String> ts=new TreeSet<String>();
  hm.put("02","ng");
  hm.put("03","zhan");
  hm.put("04","ang");

  System.out.println(hm.get("01"));
  System.out.println(hm);
  ts=hm.keySet();                               //  MapDemo.java:16: 不兼容的类型
                                                        //找到: java.util.Set<java.lang.String>
                                                        //需要: java.util.TreeSet<java.lang.String>
                                                        // ts=hm.keySet();
                                                                              ^
                                                        //         1 错误     为什么会发生这样的错误
}
}

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 很给力!

查看全部评分

6 个回复

倒序浏览
hm.keySet();这个方法返回的是一个Set,ts是一个TreeSet集合,从多态的角度来说相当于这样
TreeSet ts = Set集合,相当于
子类 = 父类
这显然是不合理的,TreeSet实现了Set集合,不能子类指向父类。
代码中的ts = hm.keySet()
改成Set<String> set = hm.keySet();就可以编译通过了
import java.util.*;
class MapDemo
{
    public static void main(String[] args)
    {
       HashMap<String,String> hm=new HashMap<String,String>();
       TreeSet<String> ts=new TreeSet<String>();
       hm.put("02","ng");
       hm.put("03","zhan");
       hm.put("04","ang");

       System.out.println(hm.get("01"));
       System.out.println(hm);
       Set<String> set = hm.keySet();
    }
}


评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这是因为HashMap的keySet()方法返回的是一个Set集合。至于keySet()方法返回什么具体的Set集合我个人认为和这个HashMap的底层数据结构有关。
楼主的代码可以这样修改:
import java.util.*;
class MapDemo
{
      public static void main(String[] args)
      {
             HashMap<String,String> hm=new HashMap<String,String>();
             Set<String> ts=new TreeSet<String>();
             hm.put("02","ng");
             hm.put("03","zhan");
             hm.put("04","ang");

             System.out.println(hm.get("01"));
             System.out.println(hm);
             ts=hm.keySet();                              

       }
}            
回复 使用道具 举报
这里涉及到了塑型,就是类型转换问题,
hm.keySet()返回的是一个Set集合对象,而对象只能被塑型为父类对象,因为任何一个子类对象都可以充当一个父类对象,
因为子类继承了父类的属性和行为,但是反过来却不成立。
比如一条狗肯定是一个动物,但是一个动物却并不一定是一条狗,
在你的程序中,就是将子类转为父类了,就好比说,明明是一个动物,你非得说成是狗,所以编译通不过。明白了吗?
回复 使用道具 举报
hm.keySet();方法返回的是Set,在文档中有明确的标明,而你的ts是一个TreeSet集合,子类接受父类这明显是错误的。
Set<String> key = hm.keySet();
System.out.println(key);
这样写就可以获取到所有键的Set集合。

评分

参与人数 1技术分 +1 收起 理由
包晗 + 1

查看全部评分

回复 使用道具 举报
懂了! 谢谢讲解。问题已解决
回复 使用道具 举报
keySet()方法返回的是一个Set接口,而TreeSet类是Set接口的实现类,也就是说TreeSet类是Set接口的子类,不可以将父类对象赋给子类引用的,多态是:
父类引用指向子类对象,而不是子类引用指向父类对象.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马