Dar*_*usz 1 java collections collection-initializer
在以下代码中,该getEntriesNotWorking方法报告编译时错误:
public class DoubleBracketInitializerTest {
class Container {}
class Entry {
Container container;
public Entry(Container container) {
this.container = container;
}
}
class DetailedContainer extends Container {
List<Entry> getEntriesNotWorking() {
return new ArrayList<Entry>() {{
add(new Entry(this)); // compile-time error mentioned below
}};
}
List<Entry> getEntriesWorking() {
return Arrays.asList(new Entry(this));
}
}
}
Run Code Online (Sandbox Code Playgroud)
错误:
构造函数DoubleBracketInitializerTest.Entry(new ArrayList(){})未定义
虽然该getEntriesWorking()方法正确编译.构造函数显然在那里,因为它DetailedContailer是一个子类Contailer.
这两种方法有什么区别,使代码无效?如何使双括号初始化程序适用于此类层次结构?
在双括号中的初始化:
return new ArrayList<Entry>() {{
add(new Entry(this)); // compile-time error mentioned below
}};
Run Code Online (Sandbox Code Playgroud)
创建一个匿名内部类,ArrayList<Entry>在这种情况下是它的子类.因此,this引用引用子类的实例ArrayList<Entry>而不是DetailedContainer.要获取类当前实例的this引用DetailedContainer,请使用DetailedContainer.this
return new ArrayList<Entry>() {{
add(new Entry(DetailedContainer.this));
}};
Run Code Online (Sandbox Code Playgroud)
当然,如果您不想要固定大小的列表,可以直接使用:
return new ArrayList<Entry>(Arrays.asList(new Entry(this)));
Run Code Online (Sandbox Code Playgroud)
而不是匿名类.这更容易理解.
也可以看看: