为什么打印出来的是person类型?但在转换为person类型时要强制转换??不然报错

为什么打印出来的是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