Получить TypeReference для типа оболочки из вложенного типаJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Получить TypeReference для типа оболочки из вложенного типа

Сообщение Anonymous »

Jackson TypeReference позволяет конкретизировать параметры универсального типа типа посредством создания подклассов. Пример:

Код: Выделить всё

final var typeRef = new TypeReference() {};
final List list = mapper.readValue(input, typeRef);
final MyType first = list.get(0);
Это работает только в том случае, если полный тип известен во время подкласса. Извлечение вызова преобразования в общий метод не сработает:

Код: Выделить всё

 T convert(final String input) {
final var typeRef = new TypeReference() {};
final List list = mapper.readValue(input, typeRef);
return list;
}

final MyType first = list.get(0);
(потому что он стирает новый TypeReference() {, который, скорее всего, будет десериализован в List).

Я хочу десериализовать и развернуть экземпляры универсальных типов, не предоставляя полную сигнатуру типа на сайте вызова. . Сайт вызова должен интересоваться только внутренним (обернутым) типом, поскольку это единственный тип, с которым он будет взаимодействовать. Учитывая следующие определения записей:

Код: Выделить всё

private record MyResponse(MyResult result) {}

private record MyResult(List values) {}

private record MyStringValue(String name) {
@Override public String toString() {
return "'" + name + "'";
}
}
и метод

Код: Выделить всё

 MyResult convert(final String input, final TypeReference typeRef) {
try {
return objectMapper.readValue(input, typeRef).result();
} catch (final JsonProcessingException ex) {
throw new RuntimeException(ex);
}
}
как я могу развернуть результат этой функции и вернуть только экземпляр T, не предоставляя полную ссылку типа TypeReference?
У меня:

Код: Выделить всё

 List unwrap(final String input, final TypeReference typeRef) {
return convert(content, typeRef).values();
}
который должен называться так:

Код: Выделить всё

final List values = unwrap(input, new TypeReference() {});
// or with diamond operator:
final List values = unwrap(input, new TypeReference() {});
Вызывающим unwrap не обязательно знать ни о MyResponse, ни о MyResult. Можно ли определить unwrap таким образом, чтобы детали реализации были скрыты?

Код: Выделить всё

final List values = unwrap(input, new TypeReference() {});

 List unwrap(final String input, final TypeReference typeRef) { // 

Подробнее здесь: [url]https://stackoverflow.com/questions/79185626/derive-typereference-for-wrapper-type-from-nested-type[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»