User.class可以在编译时就确定下来Class的泛型,而new User().getClass()实际上是运行时才能确定下来实际是什么泛型。举个例子:
public class User{
}
public class Student extends User{
public static void main(String[] args) {
User user1 = new User();
User user2 = new Student();
//输出User
System.out.println(user1.getClass());
//输出Student
System.out.println(user2.getClass());
}
}
由此可见,Object.getClass()方法返回的Class泛型是运行时才能确定的,所以返回的类型是Class>,顺带贴下jdk源码上的注释
/**
* Returns the runtime class of this {@code Object}. The returned
* {@code Class} object is the object that is locked by {@code
* static synchronized} methods of the represented class.
*
*
The actual result type is {@code Class extends |X|>}
* where {@code |X|} is the erasure of the static type of the
* expression on which {@code getClass} is called. For
* example, no cast is required in this code fragment:
*
*
* {@code Number n = 0; }
* {@code Class extends Number> c = n.getClass(); }
*
*
* @return The {@code Class} object that represents the runtime
* class of this object.
* @see Class Literals, section 15.8.2 of
* The Java™ Language Specification.
*/
public final native Class> getClass();