1. 程式人生 > >java反射之超型別限定?super

java反射之超型別限定?super

package com.test.testClass;

import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        Class<TonyToy> cls = TonyToy.class;
        TonyToy tonyToy = cls.newInstance();
        Class<? super TonyToy> cls1 = cls.getSuperclass();
        Object object = cls1.newInstance();
    }
}

class TonyToy {

}

1 TonyToy.class -> 生成Class物件,同時泛化為TonyToy類。

(.class 生成Class物件,然後使用該物件。這分為三步:載入,連結,初始化。載入:由類的載入器執行,查詢相關位元組碼,然後生成Class物件。連結:驗證位元組碼,為靜態域分配儲存空間。初始化:如果該類由超類,進行初始化,執行靜態初始化塊和靜態初始化器。)(final static修飾的屬性,可以不用初始化,直接讀取其值。)

2.下一句:cls.newInstance() 則建立了一個TonyToy的例項。

cls需要一個空構造器來建立這個例項,若沒有則會報異常。

3.我們想過cls,也就是TonyToy來建立它的父類物件。我們可以看到<>裡是? super TonyToy  

我們先不考慮這個。假設有一個TonyToy有一個Toy父類。那麼,在<>裡,我該寫Toy嗎?答案是不能這麼寫。

因為Class的不確定性, 導致我們明面上不能直接寫Toy,而是應該寫 ? super TonyToy ,這樣,即使程式中沒有TonyToy的父類存在,也會建立一個TonyToy的父類,然後建立一個例項。反射不管你程式中有沒有指定父類。它都會通過? super TonyToy,這種形式,來代表TonyToy的父類。父類的不確定性,導致假設它的直接父類是Object,所以newInstance()返回的是Object型別。