我理解java的泛型是假泛型,只在編譯期有效,為什么用如下方式能獲得父類的泛型。class Child extends Parent<String>//Child類中可通過如下代碼獲取到帶<String>的Parent((ParameterizedType)getClass().getGenericSuperclass().getActualTypeArguments()[0];class Test<String>如果當(dāng)前類帶了泛型,那么怎么獲???或說獲取不到
2 回答

冉冉說
TA貢獻(xiàn)1877條經(jīng)驗 獲得超1個贊
java的范型是擦除法,就是只是在編譯的時候檢測類型是否安全,而在運行時這些范型類型已經(jīng)被擦除,因此運行時使用反射時無法獲知范型的類型,比如:
List<String> list = new ArrayList<>();
java在編譯的時候會檢測所有加入到list里面的都是String類型,編譯后的class文件中是不會有范型的信息,所以運行的時候通過反射API是無法得知list的范型是String的。
而范型子類不一樣:
class Child extends Parent<String>
java在編譯的時候會檢測父類的范型信息,因為子類聲明了范型的類型并且在子類的代碼中會使用到該類型,所以java會在生成的class中記錄該子類聲明的范型類型,所以只有在這種情況下運行時通過反射API可以取到該范型的類型。

翻閱古今
TA貢獻(xiàn)1780條經(jīng)驗 獲得超5個贊
你好!一下代碼能拿到當(dāng)前類所帶的泛型類型了哦!當(dāng)然這是你當(dāng)前類是有定義泛型的前提下才會有,沒有定義泛型是會報 數(shù)組越界的哦。
getClass().getTypeParameters()[0];
添加回答
舉報
0/150
提交
取消