黑马程序员技术交流社区

标题: 这是为什么? [打印本页]

作者: 郑世光    时间: 2012-9-1 09:27
标题: 这是为什么?
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 错误     为什么会发生这样的错误
}
}


作者: 黑马张旭明    时间: 2012-9-1 09:55
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();
    }
}



作者: 牛杨    时间: 2012-9-1 10:06
这是因为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();                              

       }
}            

作者: 陈莹    时间: 2012-9-1 10:14
这里涉及到了塑型,就是类型转换问题,
hm.keySet()返回的是一个Set集合对象,而对象只能被塑型为父类对象,因为任何一个子类对象都可以充当一个父类对象,
因为子类继承了父类的属性和行为,但是反过来却不成立。
比如一条狗肯定是一个动物,但是一个动物却并不一定是一条狗,
在你的程序中,就是将子类转为父类了,就好比说,明明是一个动物,你非得说成是狗,所以编译通不过。明白了吗?
作者: 芦曦    时间: 2012-9-1 10:15
hm.keySet();方法返回的是Set,在文档中有明确的标明,而你的ts是一个TreeSet集合,子类接受父类这明显是错误的。
Set<String> key = hm.keySet();
System.out.println(key);
这样写就可以获取到所有键的Set集合。
作者: 郑世光    时间: 2012-9-1 10:45
懂了! 谢谢讲解。问题已解决
作者: AngieFans85    时间: 2012-9-1 10:58
keySet()方法返回的是一个Set接口,而TreeSet类是Set接口的实现类,也就是说TreeSet类是Set接口的子类,不可以将父类对象赋给子类引用的,多态是:
父类引用指向子类对象,而不是子类引用指向父类对象.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2