Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java8为Gson编写序列化程序_Java_Json_Serialization_Gson_Java 8 - Fatal编程技术网

使用Java8为Gson编写序列化程序

使用Java8为Gson编写序列化程序,java,json,serialization,gson,java-8,Java,Json,Serialization,Gson,Java 8,我有一个自己的类,名为MyDate,我想为Gson编写一个序列化程序。此代码适用于: GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(MyDate.class, new JsonSerializer<MyDate>() { @Override public JsonElement serialize(MyDate date, Type typeOfSrc, JsonSeriali

我有一个自己的类,名为
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());
    }
});
但这里eclipse告诉我

此表达式的目标类型必须是函数接口


Java 8代码有什么问题?

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

这是一个
接口
,具有单个
摘要
方法

对象
作为第二个参数

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

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

builder.registerTypeAdapter(MyDate.class, serializer);
final JsonSerializer serializer=(日期、typeOfSrc、上下文)->新的JsonPrimitive(date.toString());
registerTypeAdapter(MyDate.class,序列化程序);

通过这种方式,您可以告诉编译器要实现哪个SMI。

您确定要使用Java 8编译吗<代码>生成器.registerTypeAdapter(MyDate.class,(JsonSerializer)(日期,typeOfSrc,上下文)->新的JsonPrimitive(date.toString())适用于me@AlexisC. 这是因为演员阵容(也是另一个解决方案)。@Radiodef我这么说是因为OP不应该有这个错误消息。使用javac,我得到了不兼容的类型:对象不是函数接口。这是有道理的,所以可能是ECJ消息有点误导(这不会让我感到惊讶);-)。。。确实,目标类型不是一个函数接口,但是javac在这里更精确一些。。。。但别客气。我的第一条评论有点愚蠢,如果OP有这个错误消息,那么他显然是用Java8:DThanks编译的。第一行末尾缺少分号。我不允许做这么小的编辑。
final JsonSerializer<MyDate> serializer = (date, typeOfSrc, context) -> new JsonPrimitive(date.toString());

builder.registerTypeAdapter(MyDate.class, serializer);