У меня похожая проблема, и я действительно нашел решение, которое работает для меня!
Это можно сделать, но это может быть ненадежно (то есть не работает во всех ситуациях).Сначала нужно получить «Поле» (через отражения).Затем получите «GenericType».Затем попробуйте привести это к «ParameterizedType».Это возможно, если у него действительно есть параметр.Затем получите «ActualTypeArguments».Обычно это классы, поэтому вы можете привести их (если не можете попробовать Class.forName (...)), и тогда у вас уже есть тип элементов в списке.
Однако,это не сработает, если я сделаю это:
class MyList extends List<String> {... }
А потом:
MyList list = new MyList(); // This would be List<String>
На самом деле вам нужно проверить тип, чтобы увидеть, является ли он списком и имеет ли онтип, объявленный в любом классе или интерфейсе.Но их может быть больше одного, и тип может быть привязан ко многим интерфейсам, а не только к одному классу.конечно, вы могли бы просто игнорировать свойства, которые не являются «List», и, возможно, выдать ошибку компилятора, если она есть (я, вероятно, просто сделаю это).
Тогда есть проблема с подстановочными знаками: List list= ... Все, что вы можете сделать, это заменить его на «Объект», но это небезопасно, если вы хотите добавить элементы в список!(опять же, вы можете проверить это во время компиляции и выдать ошибку, если есть подстановочные знаки)
Другое решение - использовать проверенный список (см. Collections.checkedList (List, Class)) и попытаться получить этот типво время выполнения (вам, вероятно, нужно размышление для этого).Это будет работать намного лучше и будет гораздо надежнее, чем просто дженерики.