Лямбда-выражение для TypeAdapterFactory - PullRequest
2 голосов
/ 14 марта 2019

Я пытаюсь использовать лямбда-выражение, чтобы упростить приведенный ниже код.Подробную информацию можно найти здесь: Не удалось сериализовать объектную причину HibernateProxy .

public class HibernateProxyTypeAdapter extends TypeAdapter<HibernateProxy> {
    public static final TypeAdapterFactory FACTORY = new TypeAdapterFactory() {
        @Override
        @SuppressWarnings("unchecked")
        public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
            return (HibernateProxy.class.isAssignableFrom(type.getRawType())
                    ? (TypeAdapter<T>) new HibernateProxyTypeAdapter(gson)
                    : null);
        }
    };
    ...
    ...
    ...
}

Я изменил код на это:

public static final TypeAdapterFactory FACTORY = (gson, type) -> HibernateProxy.class.isAssignableFrom(type.getRawType())
                    ? (TypeAdapter<T>) new HibernateProxyTypeAdapter(gson)
                    : null;

Но яполучаю ошибку в Eclispe: Illegal lambda expression: Method create of type TypeAdapterFactory is generic

Я тоже пробовал это, но выдает ту же ошибку.

public static final TypeAdapterFactory FACTORY = (gson, type) -> HibernateProxy.class.isAssignableFrom(type.getRawType())
                    ? (TypeAdapter<Hibernate>) new HibernateProxyTypeAdapter(gson)
                    : null;

Можно ли использовать лямбда-выражение в этой ситуации?Как мне изменить мой код?

1 Ответ

0 голосов
/ 14 марта 2019

Я не думаю, что это можно «упростить», но быть еще более сложным. Причина ошибки заключается в том, что метод является универсальным, и вы должны использовать универсальные (функциональные) интерфейсы, например:

@SuppressWarnings("rawtypes")
private static final BiFunction<Gson, TypeToken, TypeAdapter> GENERIC_FACTORY = (gson, typeToken)
        -> HibernateProxy.class.isAssignableFrom(typeToken.getRawType()) ? new HibernateTypeAdapter(gson) : null;

static final TypeAdapterFactory FACTORY = GENERIC_FACTORY::apply;

Ну, так себе выглядит, верно? Если встроено, то еще более уродливо:

static final TypeAdapterFactory FACTORY = ((BiFunction<Gson, TypeToken, TypeAdapter>) (gson, typeToken)
        -> HibernateProxy.class.isAssignableFrom(typeToken.getRawType()) ? new HibernateTypeAdapter(gson) : null)::apply;

Если вы действительно считаете, что лямбда-выражения - это то, что вам нужно в таком сценарии, вот два способа:

Заводской адаптер универсального типа

@FunctionalInterface
public interface GenericTypeAdapterFactory
        extends TypeAdapterFactory {

    TypeAdapter<?> createUnchecked(Gson gson, TypeToken<?> typeToken);

    @Override
    default <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> typeToken) {
        @SuppressWarnings("unchecked")
        final TypeAdapter<T> castTypeAdapter = (TypeAdapter<T>) createUnchecked(gson, typeToken);
        return castTypeAdapter;
    }

}

с

static final TypeAdapterFactory FACTORY = (GenericTypeAdapterFactory) (gson, typeToken)
        -> HibernateProxy.class.isAssignableFrom(typeToken.getRawType()) ? new HibernateTypeAdapter(gson) : null;

или

Универсальная оболочка

interface GsonTypeAdapterFactory<T>
        extends BiFunction<Gson, TypeToken<T>, TypeAdapter<T>> {
}

static <TF> TypeAdapterFactory wrap(final GsonTypeAdapterFactory<TF> factory) {
    return new TypeAdapterFactory() {
        @Override
        public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> typeToken) {
            @SuppressWarnings("unchecked")
            final TypeToken<TF> castTypeToken = (TypeToken<TF>) typeToken;
            @SuppressWarnings("unchecked")
            final TypeAdapter<T> castTypeAdapter = (TypeAdapter<T>) factory.apply(gson, castTypeToken);
            return castTypeAdapter;
        }
    };
}

с

static final TypeAdapterFactory FACTORY = GenericTypeAdapterFactory.wrap((GenericTypeAdapterFactory.GsonTypeAdapterFactory<HibernateProxy>) (gson, typeToken)
        -> HibernateProxy.class.isAssignableFrom(typeToken.getRawType()) ? new HibernateTypeAdapter(gson) : null
);

Имея по крайней мере 3-4 способа обойти это, я бы не рекомендовал ни один из них, но придерживался вашего первоначального пути.

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