为什么打印出来的是person类型?但在转换为person类型时要强制转换??不然报错
public class Test {
public static void main(String[] args) {
HashSet hs = new HashSet();
hs.add(new Person("a1",11)); //将Person类添加进Hashset里面
Iterator it = hs.iterator(); //定义1个迭代器
while(it.hasNext()) //开始遍历HashSet
{
System.out.println(it.next().getClass().toString()); //测试类型,结果为class Person
Person p = (Person) it.next(); //编译通过
Person p = it.next(); //编译报错
}
}
}
getClass()永远返回的是真实类型,而不是变量的类型,因为变量的类型是代码编写者此刻知道的,要是getClass()不能返回真实类型,要它何用。
Person p = it.next(); 这个肯定不可以,因为编译的时候不能判断it.next()返回了什么类型,万一它返回的不是Person而是别的什么东西呢。
特别注意两个概念:编译时
和运行时
。编译的时候能确定的事情和运行的时候才能确定的事情。getClass()是运行时获取的,所以能知道具体类型
Person p = it.next(); 这里next()返回的类型是object,编译器无法知道它是不是Person
因为 Java 的泛型是一种语法糖,底层实际存储的类型是 Object ,所以直接取值赋给 Person 类型会报类型不匹配错误。
你可以用反编译工具打开,代码就变成了 Object 类型。
迭代器返回的类型是object