gpt4 book ai didi

java - TypeAdapterFactory 的 Lambda 表达式

转载 作者:行者123 更新时间:2023-11-30 12:07:09 26 4
gpt4 key购买 nike

我正在尝试使用 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 表达式?我应该如何修改我的代码?

最佳答案

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

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

关于java - TypeAdapterFactory 的 Lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55151846/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com