OCJP有这样一道题目,会有编译错误,结果可以编译运行
准备考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