2014-01-16 21 views
5

我有一個像List<? extends MyPojo> myPojos = new ArrayList<>();的領域。如何獲得通配通用字段的上限?

我想通過反思得到myPojos的上限是MyPojo類型的事實。

我可以得到Field沒問題,然後getGenericType,但這只是返回一個Type它沒有任何方法。我可以將它投射到ParameterizedType,但是getActualTypeArguments()

ParameterizedTypetoString()方法返回的期望值,似乎是沒有辦法訪問的通配符上boud的信息,以及ParameterizedType所有的實現似乎是在sun.包。

那麼,我可以在不解析toString()輸出的情況下獲得泛型類型的上限,而不依賴於sun.*類嗎?或者這種信息是由於擦除而丟失的?

+0

爲什麼?它就在源代碼中。 – EJP

+0

@EJP我正在做代碼生成使用反射。 – ArtB

回答

5

你需要轉換爲ParameterizedType,然後從getActualTypeArguments()投了TypeWildcardType,其中有一個getUpperBounds()方法。

所以

assert MyPojo.class == ((WildcardType) ((ParameterizedType) listField.getGenericType()).getActualTypeArguments()[0]).getUpperBounds()[0]; 
+0

用代碼示例編輯。 AFAICT,如果沒有'instanceof',你不能安全地做到這一點,否則你會盲目投射。 – ArtB