我有一个名为MyDate的类,想为Gson编写一个序列化器。此代码有效:

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(MyDate.class, new JsonSerializer<MyDate>() {
    @Override
    public JsonElement serialize(MyDate date, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(date.toString());
    }
});


但是我想使用Java 8的功能,因此尝试了

builder.registerTypeAdapter(MyDate.class, (date, typeOfSrc, context) ->new JsonPrimitive(date.toString()));


但是这里的月食告诉我


  此表达式的目标类型必须是功能接口


该Java 8代码有什么问题?

最佳答案

为了用lambda替换匿名类,该参数必须是单方法接口(SMI)。

这是具有单个interface方法的abstract

GsonBuilder.registerTypeAdaperObject作为第二个参数。

您需要先分配您的lambda,然后传入方法:

final JsonSerializer<MyDate> serializer = (date, typeOfSrc, context) -> new JsonPrimitive(date.toString());

builder.registerTypeAdapter(MyDate.class, serializer);


这样,您就可以告诉编译器您要实现哪个SMI。

07-24 19:51
查看更多