Как вывести конкретный тип возвращаемого значения метода с универсальным типом возвращаемого значения? - PullRequest
0 голосов
/ 09 декабря 2018

С учетом следующего интерфейса:

interface Random extends java.util.function.Supplier<Integer> { }

с java.util.function.Supplier выглядит следующим образом (сокращенно):

public interface Supplier<T> { T get(); }

Теперь рассмотрим следующее:

java.lang.reflect.Method get = Random.class.getMethod("get");
System.out.println(get.getReturnType()); // prints `class java.lang.Object`
System.out.println(get.getGenericReturnType()); // prints `T`

Как я могу сделать вывод, что тип возвращаемого значения должен быть java.lang.Integer?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Ответ Анкура верен в том смысле, что он дает подсказку к используемой технологии.Однако общее решение, охватывающее все крайние случаи, является довольно сложным, что оправдывает необходимость в небольшой библиотеке.

После более подробного изучения предмета я нашел это превосходное решение: https://github.com/leangen/geantyref#getting-the-exact-return-type-of-a-method

0 голосов
/ 09 декабря 2018

Вы, вероятно, можете сделать это с помощью кода, приведенного ниже.Идея заключается в том, что информация об общем типе потенциально доступна в байт-коде и может быть доступна во время выполнения.Для получения более подробной информации см. Ссылку ниже.

ParameterizedType parameterizedType = (ParameterizedType) subClass.getGenericSuperclass();
09
  return (Class<?>) parameterizedType.getActualTypeArguments()[parameterIndex];

https://www.javacodegeeks.com/2013/12/advanced-java-generics-retreiving-generic-type-arguments.html

В Интернете есть и другие полезные статьи, в которых также описывается это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...