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();