我有一个扩展java.util.HashMap的MyMap类,下面的代码作为一个语句块使用,但我不明白使用额外的花括号
MyMap m = new MyMap() {
{
put("some key", "some value");
}
};
现在为什么我需要额外的大括号,我不能这样做(但这会引发编译错误)
MyMap m = new MyMap() {
put("some key", "some value");
};
答案 0 :(得分:11)
此:
MyMap m = new MyMap() {
....
};
创建anonymous inner class,它是HashMap
的子类。
此:
{
put("some key", "some value");
}
是instance initializer。在创建匿名子类的实例时执行代码。
答案 1 :(得分:4)
你在这里真正做的是定义一个 MyMap 的任何子类,这可能不是你的意图......最外面的花括号围绕类内容 。在Java中,您不能将指令直接放在类块中:如果您需要在实例化类时执行代码,则将其放入构造函数中。这就是最里面的大括号:它们为你的匿名类界定了一个初始化器。
现在,你可能想要这样的东西:
MyMap m = new MyMap();
m.put("some key", "some value");
只需创建MyMap
的实例并在其上调用put
,不涉及任何匿名类。