黑马程序员技术交流社区
标题:
这是为什么?
[打印本页]
作者:
郑世光
时间:
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集合。
集合.png
(79.28 KB, 下载次数: 32)
下载附件
2012-9-1 10:15 上传
作者:
郑世光
时间:
2012-9-1 10:45
懂了! 谢谢讲解。问题已解决
作者:
AngieFans85
时间:
2012-9-1 10:58
keySet()方法返回的是一个Set接口,而TreeSet类是Set接口的实现类,也就是说TreeSet类是Set接口的子类,不可以将父类对象赋给子类引用的,多态是:
父类引用指向子类对象,而不是子类引用指向父类对象.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2