Я нашел общий и простой способ сделать это. В моем классе я создал метод, который возвращает общий тип в соответствии с его положением в определении класса. Давайте предположим определение класса следующим образом:
public class MyClass<A, B, C> {
}
Теперь давайте создадим некоторые атрибуты для сохранения типов:
public class MyClass<A, B, C> {
private Class<A> aType;
private Class<B> bType;
private Class<C> cType;
// Getters and setters (not necessary if you are going to use them internally)
}
Затем вы можете создать общий метод, который возвращает тип на основе по индексу общего определения:
/**
* Returns a {@link Type} object to identify generic types
* @return type
*/
private Type getGenericClassType(int index) {
// To make it use generics without supplying the class type
Type type = getClass().getGenericSuperclass();
while (!(type instanceof ParameterizedType)) {
if (type instanceof ParameterizedType) {
type = ((Class<?>) ((ParameterizedType) type).getRawType()).getGenericSuperclass();
} else {
type = ((Class<?>) type).getGenericSuperclass();
}
}
return ((ParameterizedType) type).getActualTypeArguments()[index];
}
Наконец, в конструкторе просто вызовите метод и отправьте индекс для каждого типа. Полный код должен выглядеть так:
public class MyClass<A, B, C> {
private Class<A> aType;
private Class<B> bType;
private Class<C> cType;
public MyClass() {
this.aType = (Class<A>) getGenericClassType(0);
this.bType = (Class<B>) getGenericClassType(1);
this.cType = (Class<C>) getGenericClassType(2);
}
/**
* Returns a {@link Type} object to identify generic types
* @return type
*/
private Type getGenericClassType(int index) {
Type type = getClass().getGenericSuperclass();
while (!(type instanceof ParameterizedType)) {
if (type instanceof ParameterizedType) {
type = ((Class<?>) ((ParameterizedType) type).getRawType()).getGenericSuperclass();
} else {
type = ((Class<?>) type).getGenericSuperclass();
}
}
return ((ParameterizedType) type).getActualTypeArguments()[index];
}
}
вы можете использовать ключ «результат» несколько раз, зависит от состояния ответа, подобного этому
` @Json(name = "status") val status: Boolean?,
@Json(name = "code") val code: Int?,
@Json(name = "result") val message: String?,
@Json(name = "result") val result: ResultObject?,
@Json(name = "result") val validation: HashMap<String,List<String>>?
`
, и зависит от ключа статуса «ur», вы можете получить правильные значения из правильного «результата» сделав условия.