Я не думаю, что это можно «упростить», но быть еще более сложным. Причина ошибки заключается в том, что метод является универсальным, и вы должны использовать универсальные (функциональные) интерфейсы, например:
@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 способа обойти это, я бы не рекомендовал ни один из них, но придерживался вашего первоначального пути.