method.getGenericReturnType()
возвращает java .lang.reflect.Type и, как вы можете видеть в javadocs, у него есть список известных подтипов:
All Known Subinterfaces:
GenericArrayType, ParameterizedType, TypeVariable<D>, WildcardType
Таким образом, вы можете использовать чтобы выполнить несколько проверок instanceof:
// is it ParameterizedType - so any type like Type<GenericType, OrMoreTypes>
if (!(method.getGenericReturnType() instanceof ParameterizedType)) return false;
ParameterizedType parametrizedReturnType = (ParameterizedType) method.getGenericReturnType();
// raw type is just a class without generic part
if (parametrizedReturnType.getRawType() != List.class) return false;
if (parametrizedReturnType.getActualTypeArguments().length != 1) return false;
Type firstArg = parametrizedReturnType.getActualTypeArguments()[0];
return firstArg == String.class;
Обратите внимание, что тип может быть более сложным, но все же совместимым со списком, если вы просто хотите прочитать некоторые данные, например, метод может иметь сигнатуру типа ArrayList<? extends String>
, а затем проверка вернет false. Если вы хотите также поддерживать такие случаи, лучше использовать некоторые библиотеки, например org. apache .commons.lang3.reflect.TypeUtils.isAssignable , поскольку такие библиотеки позволяют создавать экземпляр определения типа (эти библиотеки просто иметь собственные реализации этих интерфейсов) и выполнять более сложные проверки, такие как isAssignable
или isInstance
, поскольку, к сожалению, java не предоставляет такой API.