Есть ли способ, чтобы получить общий вид следующего класса во время выполнения (я буду называть doSomething()
во время выполнения):Generic типа класса
class MyClass<D> extends BaseClass<List<D>> {
public Class<D> getGenericClass(){
Type [] ta = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments();
Class ty = (Class) ta[0]; // is java.util.List<D> and throws a cast exception
// TODO I want to know what kind of class "D" is
}
}
class BaseClass<T>
T data;
}
Я хотел бы использовать MyClass
следующим образом:
MyClass<Foo> instance = new MyClass<Foo>();
Class<Foo> foo = instance.getGenericClass();
Строки кода сверху только для того, чтобы показать вам (упрощенный) сценарий, с которым я столкнулся. Если бы я мог создать экземпляр вручную, я бы уже знал, что я использую Foo
как общий параметр, но это не так.
FYI Я пытаюсь иметь дело с Android Parcelable
и получить правильный загрузчик классов для readParcelable()
с помощью дженериков. Бетон: MyClass implements Parcelable
. При чтении Parcel
я должен указать загрузчик классов, как этот data = parcel.readArrayList(Foo.class.getClassLoader)
, и я хочу, чтобы определить, что динамически с помощью отражения как data = parcel.readArrayList(getGenericClass().getClassLoader())
Есть ли способ, чтобы получить такую информацию?
Обычно вы бы просто использовать:
Class type = (Class) (getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
но возвращает java.util.List<D>
, но я заинтересован в том, что <D>
есть. Есть ли способ погрузиться в этот общий тип?
спасибо, но я с 'GetClass() getGenericSuperclass()) getActualTypeArguments();' я 'java.util.List' вместо 'java.util.List '. Итак, есть способ получить оценку ''? –
sockeqwe
У вас действительно есть несколько 'ClassLoader' в вашем приложении? Я не видел случая, когда тип 'класса', используемый для извлечения« ClassLoader », имел значение« Parcelable ». Можете ли вы объяснить свою ситуацию немного больше? –
Good Point, имеет значение, если 'MyClass' является частью' .aar' упакованной библиотеки? – sockeqwe