Java 为什么双括号初始化要求SerialVersionUID? public static List abc=new ArrayList(){{{//请求SerialVersionUID abc.添加(5L); abc.添加(7L); }}; public static List abc=new ArrayList()//不需要SerialVersionId 静止的{ abc.添加(5L); abc.添加(7L); }

Java 为什么双括号初始化要求SerialVersionUID? public static List abc=new ArrayList(){{{//请求SerialVersionUID abc.添加(5L); abc.添加(7L); }}; public static List abc=new ArrayList()//不需要SerialVersionId 静止的{ abc.添加(5L); abc.添加(7L); },java,serialization,Java,Serialization,因为在第一个示例中,您通过“双括号初始化”创建了ArrayList的匿名子类,ArrayList实现了可序列化接口。SerialVersionUID用于反序列化,提供反序列化是一种很好的做法,尽管严格来说不是必需的。您的IDE可能已配置为报告这些警告 在第二个示例中,您没有创建ArrayList的匿名子类,只是实例化一个并调用其方法。在第二个示例中,您实例化的类已经定义了serialVersionUID(即ArrayList) 在第一个示例中,您正在定义ArrayList的匿名子类,并且您的子类

因为在第一个示例中,您通过“双括号初始化”创建了ArrayList的匿名子类,ArrayList实现了可序列化接口。SerialVersionUID用于反序列化,提供反序列化是一种很好的做法,尽管严格来说不是必需的。您的IDE可能已配置为报告这些警告


在第二个示例中,您没有创建ArrayList的匿名子类,只是实例化一个并调用其方法。

在第二个示例中,您实例化的类已经定义了
serialVersionUID
(即
ArrayList


在第一个示例中,您正在定义
ArrayList
的匿名子类,并且您的子类需要定义自己的
serialVersionUID
。双大括号初始化实际上定义了一个匿名类,这并不总是显而易见的。

这将回答您的问题,它是相同的!在这两个示例中,您都创建了一个公共静态可修改列表——非常糟糕。@Kevin在这两个示例中,您创建公共静态可修改列表是什么意思。什么是替代方案?
public static List<Long> abc = new ArrayList<Long>(){{ //Asks for SerialVersionUID
        abc.add(5L);
        abc.add(7L);
    }};

public static List<Long> abc = new ArrayList<Long>();//Does not need SerialVersionUID
    static{
        abc.add(5L);
        abc.add(7L);
    }