讓我們假設我們有一個CustomMap<A, B>擴展型別,CommonMap<C, D>它反過來實作Map<E, F>.
自然有人會期望A == C == E,但并非總是如此 -例如,您可以有一個CustomMap<V>實作Map<String, V>。
問題是,讓我們假設我有一個Field,field.getType()是一些實作Map<K, V>. 型別本身可能是非通用的,也可能是通用的,但通用簽名不同于<K, V>等。我如何獲取K和使用反射的V型別引數Map?
uj5u.com熱心網友回復:
似乎必須撰寫代碼來抓取型別資訊,記住哪種型別對應于型別引數名稱,然后進行替換。代碼可能會因具體情況而異,例如類/介面等,但其核心是:
// Contains mappings such as K -> Integer, V -> String
Map<String, Type> typeParameters = new HashMap<>();
ParameterizedType pType = (ParameterizedType) type;
// Actual type arguments of a specific parametrized type, e.g. <Integer, PARAM> -
// the latter is resolved against typeParameters map
Type[] typeArguments = pType.getActualTypeArguments();
cls = ((Class) ((ParameterizedType) type).getRawType());
// Named arguments of type as declared, e.g. <K, V>
TypeVariable<?>[] typeParamDecls = cls.getTypeParameters();
for (int i = 0; i < Math.min(typeParamDecls.length, typeArguments.length); i ) {
Type value;
if (typeArguments[i] instanceof TypeVariable) {
value = typeParameters.get(((TypeVariable<?>) typeArguments[i]).getName());
} else {
value = typeArguments[i];
}
typeParameters.put(typeParamDecls[i].getName(), value);
}
這需要遞回地應用于cls.getGenericSuperclass()/cls.getGenericInterfaces()直到您首先找到您想要的型別。如果在任何地方使用原始型別,可能會出現邊緣情況。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/356473.html
上一篇:區分泛型類中泛型值的過濾陣列的項
下一篇:泛型型別T的Python子類串列
