【问题标题】:Lambda expression for TypeAdapterFactoryTypeAdapterFactory 的 Lambda 表达式
【发布时间】:2019-08-04 17:13:42
【问题描述】:

我正在尝试使用 lambda 表达式来简化以下代码片段。详细信息可以在这里找到:Could not serialize object cause of 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;

在这种情况下是否可以使用 lambda 表达式?我应该如何修改我的代码?

【问题讨论】:

标签: java lambda gson


【解决方案1】:

我不认为它可以“简化”,而是更复杂。错误的原因是该方法是通用的,您必须使用通用(功能)接口,如下所示:

@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;

如果你真的相信 lambda 表达式是你在这种情况下所需要的,这里有两种方法:

通用类型适配器工厂适配器

@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 种方法可以解决这个问题,我不会推荐其中任何一种,但请坚持您最初的方法。

【讨论】:

    猜你喜欢
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2013-09-30
    • 2010-11-12
    • 2019-07-29
    相关资源
    最近更新 更多