双括号集合初始值设定项中的未定义构造函数错误

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.

这两种方法有什么区别,使代码无效?如何使双括号初始化程序适用于此类层次结构?

Roh*_*ain 5

双括号中的初始化:

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)

而不是匿名类.这更容易理解.


也可以看看: