4

我搜索了这个,但不幸的是找不到匹配项,我在这样local anonymous inner class的方法中有这个:-

new Object(){
    public void open(){
        // do some stuff
    }
    public void dis(){
        // do some stuff
    }
};

2 methods里面(open,dis),我知道如果我想使用它们中的任何一个,就这样做

new Object(){
    public void open(){
        // do some stuff
    }
    public void dis(){
        // do some stuff
    }
}.open()

现在我的问题是如果我想同时调用这两种方法该怎么办

4

3 回答 3

6

您可以创建这样的界面:

interface MyAnonymous {
   MyAnonymous open();
   MyAnonymous dis();  //or even void here
}

new MyAnonymous(){
    public MyAnonymous open(){
        // do some stuff
        return this;
    }
    public MyAnonymous dis(){
        // do some stuff
        return this;
    }
}.open().dis();

编辑 - -

正如@Jeff 指出的那样,只有在分配了引用时才需要接口。事实上,以下解决方案(由@JamesB 提出)是完全有效的:

new MyObject(){
        public MyObject open(){
            // do some stuff
            return this;
        }
        public MyObject dis(){
            // do some stuff
            return this;
        }
    }.open().dis();

但这不会编译:

MyObject myObject = new MyObject(){
            public MyObject open(){
                // do some stuff
                return this;
            }
            public MyObject dis(){
                // do some stuff
                return this;
            }
        };
myObject.open().dis();  //not compiling since anonymous class creates a subclass of the class
于 2014-03-04T22:39:33.783 回答
1
new MyObject(){
    public MyObject open(){ 
        // do some stuff
        return this;
    }
     public MyObject dis(){ 
        // do some stuff 
        return this;
    }
}.open().dis();
于 2014-03-04T22:41:30.680 回答
1

如果要从匿名类调用方法,则意味着它扩展了超类或实现了接口。因此,您可以简单地将该实例存储在父级的引用中,并在其上调用合约的所有方法:

interface MyAnonymous {
   void open();
   void dis();
}

MyAnonymous anon = new MyAnonymous () {
    public void open(){
        // do some stuff
    }
    public void dis(){
        // do some stuff
    }
};

anon.open();
anon.dis();
于 2014-03-04T23:15:45.447 回答