天天看點

java Class的 getSuperclass與getGenericSuperclass差別

Class的getInterfaces與getGenericInterface差別 

一、getSuperclass   傳回直接繼承的父類(由于編譯擦除,沒有顯示泛型參數)

​ Class<? super T>​

​getSuperclass()​

​ 

          傳回表示此 ​

​Class​

​ 所表示的實體(類、接口、基本類型或 void)的超類的 ​

​Class​

​。

傳回表示此 ​

​Class​

​Class​

如果此 ​

​Class​

​ 表示 ​

​Object​

​ 類、一個接口、一個基本類型或 void,則傳回 null。

如果此對象表示一個數組類,則傳回表示該 ​

​Object​

​ 類的 ​

​Class​

​ 對象。 

傳回:

此對象所表示的類的超類。

二、getGenericSuperclass  傳回直接繼承的父類(包含泛型參數)

​ Type​

​getGenericSuperclass()​

          傳回表示此 Class 所表示的實體(類、接口、基本類型或 void)的直接超類的 Type。

傳回表示此 Class 所表示的實體(類、接口、基本類型或 void)的直接超類的 Type。

如果超類是參數化類型,則傳回的 Type 對象必須準确反映源代碼中所使用的實際類型參數。如果以前未曾建立表示超類的參數化類型,則建立這個類型。有關參數化類型建立過程的語義,請參閱 ​

​ParameterizedType​

​ 聲明。

如果此 Class 表示 Object 類、接口、基本類型或 void,則傳回 null。

如果此對象表示一個數組類,則傳回表示 Object 類的 Class 對象。 

此對象所表示的類的超類

抛出:

​GenericSignatureFormatError​

​ - 如果正常類簽名不符合 Java Virtual Machine Specification, 3rd edition 規定的格式​

​TypeNotPresentException​

​ - 如果正常超類引用不存在的類型聲明​

​MalformedParameterizedTypeException​

​ - 如果正常超類引用的參數化類型由于某種原因無法執行個體化

代碼執行個體:

java Class的 getSuperclass與getGenericSuperclass差別
package cn.test;

public class Test {

    public static void main(String[] args) {
        System.out.println("Student.class.getSuperclass()\t"      
+ Student.class.getSuperclass());
        System.out.println("Student.class.getGenericSuperclass()\t"      
+ Student.class.getGenericSuperclass());

        System.out.println("Test.class.getSuperclass()\t"      
+ Test.class.getSuperclass());
        System.out.println("Test.class.getGenericSuperclass()\t"      
+ Test.class.getGenericSuperclass());

        System.out.println("Object.class.getGenericSuperclass()\t"      
+ Object.class.getGenericSuperclass());
        System.out.println("Object.class.getSuperclass()\t"      
+ Object.class.getSuperclass());

        System.out.println("void.class.getSuperclass()\t"      
+ void.class.getSuperclass());
        System.out.println("void.class.getGenericSuperclass()\t"      
+ void.class.getGenericSuperclass());

        System.out.println("int[].class.getSuperclass()\t"      
+ int[].class.getSuperclass());
        System.out.println("int[].class.getGenericSuperclass()\t"      
+ int[].class.getGenericSuperclass());
    }

}

class Person<T> {

}

class Student extends Person<Test> {

}      
java Class的 getSuperclass與getGenericSuperclass差別
Student.class.getSuperclass() class cn.test.Person
Student.class.getGenericSuperclass()  cn.test.Person<cn.test.Test>
Test.class.getSuperclass()  class java.lang.Object
Test.class.getGenericSuperclass() class java.lang.Object
Object.class.getGenericSuperclass() null
Object.class.getSuperclass()  null
void.class.getSuperclass()  null
void.class.getGenericSuperclass() null
int[].class.getSuperclass() class java.lang.Object
int[].class.getGenericSuperclass()  class java.lang.Object