简单理解就是:equals方法入参是Object类型,Object o 被你赋值为User对象,但是对于编译器来说,它只认变量声明的类型,。可乐不管放到杯子里还是放到碗里,它还是可乐,不会变成白开水
。而Object类型是没有name和age属性的,所以如果你直接使用o变量,是没办法调用name和age属性的。所以要用强制转换将Object o转成User u,让编译器理解原来杯子里装的是可乐
,o对象本来就是User类型,只不过被赋值给Object o,所以强转不会报错。
简单来说因为equals这个方法的参数规定是Object 这个最大的类型!
而你要比较的其它类型都是Object 的直接或者间接子类(单继承);
所以根据多态(向上转型是调用的子类和父类共有的属性方法)、(向下转型能调用子类特有的属性方法);
你的目的是比较子类的属性,所以需要向下转型。