当前位置:编程学习 > JAVA >>

帮忙解读一段集合加范型的代码

准备考OCJP有这样一道题目,代码贴上来,我以为会有编译错误,结果可以编译运行.

我有2个疑问,请高手帮忙解释一下,谢谢!

package com.ocjp.collection;

 import java.util.*;
 public class Salt {
 public static void main(String[] args) {
 Set s1 = new HashSet(); //由于没有定义泛型,可以理解成Set<Object> s1 = new HashSet<Object>();
 s1.add(0); //int放到了 Set s1;但是int被当成Object;
 s1.add("1"); //String放到了 Set s1;但是String被当成Object;
 
 //问题一:当把s1作为实参,copy给方法doStuff的形参,相当于泛型从Set<Object>转成了Set<Number>,父类为什么能downcast成子类?
 doStuff(s1);
 }
 
 static void doStuff(Set<Number> s) {

 do2(s);

 Iterator i = s.iterator();
 
 while(i.hasNext()) System.out.print(i.next() + " ");
 
 Object[] oa = s.toArray();
 
 for(int x = 0; x < oa.length; x++)
 System.out.print(oa[x] + " ");
 
 System.out.println(s.contains(0)); //Output: true; 问题二:0被当成Object,Object没有重写equals(), hashcode(),s集合里的元素0和contains()方法中的参数0怎么会相等呢?
 System.out.println(s.contains(1)); //Output: false; 
 }
  static void do2(Set s2) { System.out.print(s2.size() + " "); }
 
 }

输出为:
2 0 1 0 1 true
false

OCJP generic Collection --------------------编程问答--------------------  “s1.add(0); //int放到了 Set s1;但是int被当成Object;”
 ”System.out.println(s.contains(0)); //Output: true;“

上面的语句里 0 被自动装箱成Integer类型了。
--------------------编程问答-------------------- --------------------编程问答--------------------
引用 1 楼 nmyangym 的回复:
 “s1.add(0); //int放到了 Set s1;但是int被当成Object;”
 ”System.out.println(s.contains(0)); //Output: true;“

上面的语句里 0 被自动装箱成Integer类型了。


+10086 --------------------编程问答-------------------- LZ试试:Set<Object> s1 = new HashSet<Object>(); 

调用的地方编译不通过。

没有定义泛型,可以理解成Set<Object> s1 = new HashSet<Object>();这句话只是理解,实际上不写泛型是不校验泛型的意思,还是有差别的。 --------------------编程问答-------------------- 自动拆箱装箱。。。。。。 --------------------编程问答-------------------- 问题1: 子类可以在父类的基础上进行扩展,子类包含父类的属性,方法。所以父类可以转为子类的类型。反之,父类不包含子类中扩展的属性,方法,一般情况下子类不能转为父类的类型。在Thinking in java中叫upcasting

问题二:1.Java对象都是继承自Object类,在Oject有一个有一个pulbic的equals方法 
查看api可以发现其指示某个其他对象是否与此对象“相等”。这里的“相等”是物理地址相等,是严格的比较。如果我们需要的是值相等即可,那么可以重写方法覆盖。当然重写还需要一些条件,楼主可以看《effective java》。
public boolean equals(Object obj) {
return (this == obj);
}

2.至于你的System.out.println(s.contains(0));结果为true则是jdk1.5增加的新特性自动装箱拆箱
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,