Как восстановить информацию об универсальном типе для классов с заданным TypeLiteral? - PullRequest
0 голосов
/ 14 октября 2010

У меня есть следующая проблема:

С учетом литерала типа Guice TypeLiteral<T> template и класса Class c, реализующего или расширяющего T, создайте тип Type t, который эквивалентен c с созданием всех переменных типа для совместимости с template.

Если c не имеет переменных типа, это легко;c это рассматриваемый тип.Однако, если c имеет переменные типа, мне нужно сделать следующее:

  1. Найти тип в иерархии наследования и реализации c, соответствующий необработанному типу T
  2. Просмотрите структуру параметров типа, найдя любые переменные типа и их соответствующие типы в template
  3. . Используйте вспомогательные функции Guice Types, чтобы создать тип из c, созданный с помощьютипы, найденные в (2).

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

class CS<I> implements S<Map<I,Float>> {
    // some stuff
}

и литерал типа TypeLiteral<S<Map<I,Float>>>, я хочу получить тип, представляющий CS, полностью инстанцированный для соответствия литералу типа.

Itпохоже, что отражение дает достаточно информации для достижения этой цели, но логика выглядит сложной и подверженной ошибкам.Существует ли существующая библиотека, которая предоставляет эту логику?

Ответы [ 2 ]

0 голосов
/ 16 октября 2010

Эта проблема является примером проблемы объединения, и поэтому стандартный алгоритм объединения применим и не так сложен, как я первоначально думал.Кроме того, этот экземпляр проблемы допускает некоторые существенные упрощающие допущения, поскольку одно из деревьев не будет содержать переменных.200 строк Java позже, у меня есть рабочее решение.

0 голосов
/ 15 октября 2010

TypeLiteral.getSupertype () должно помочь:

TypeLiteral<?> t = TypeLiteral.get(x).getSupertype(y);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...