我有一个名为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.registerTypeAdaper
将Object
作为第二个参数。
您需要先分配您的lambda,然后传入方法:
final JsonSerializer<MyDate> serializer = (date, typeOfSrc, context) -> new JsonPrimitive(date.toString());
builder.registerTypeAdapter(MyDate.class, serializer);
这样,您就可以告诉编译器您要实现哪个SMI。